fontforge.png

R语言用来做数据处理和分析很方便,借助ggplot2能够方便的画出比较漂亮且信息丰富的图形,但是由于历史原因,R对中文的支持并不是很好,尤其是作图的时候需要一些特殊的技巧才能完美的展示中文字体,同时对于中英文混合的情况,经过一番摸索之后也找到了比较完美的方案。

一句话总结:在plot或者ggplot2theme中设定family参数,如需要保存为pdf文件,则利用showtext包添加字体,如需分别指定中英文字体,就制作合适的中英文混合字体。

原生作图函数的中文显示

plot函数中设置family参数

在R中,使用plot函数画图时如果不指定字体,中文会显示为乱码,比如下面的语句:

 plot(c(1:10), xlab = '横轴', ylab = '纵轴', main = '中文标题 Title')

得到的图形为:

06c2ffee487f8d7266b15caa830dba5f.png

此时可以通过设置family属性来显示中文字体,如下所示:

plot(c(1:10), xlab = '横轴', ylab = '纵轴', main = '中文标题 Title', family = 'SimSun')

得到的图形为:

b68c02508473bdd014f61fd7df667434.png

可以发现中文根据设置显示为了宋体,family的值可以设置为任何在电脑中已经安装的字体名称,只要该字体包含中文字符,那么就可以正常显示中文,此外,如果想要分别设置主标题、副标题、坐标轴等的字体样式,在plot函数中设置font.main,font.sub,font.axis,font.lab 即可。

通过设置family参数能够正常显示中文,但是如果想要将画好的图形保存下来还需要费一番周折,对于包含中文的图形,如果存储为png, jpg, tiff等格式,由于这些都是栅格图形,均是有一定数目的像素点组成,因此不存在字体能否加载的问题,可以直接进行保存。

但是大部分情况下我们希望能够将图形保存为矢量格式,因为矢量格式的文件能够无限放大不失真,并且占用磁盘空间小,方便保存与后续处理,如果有需要的话可以导出为任意分辨率的栅格图像。然而通过设定family参数得到的包含中文字符的图形在保存为pdf格式的时候会出错,比如执行下面的语句:

pdf('test.pdf')
plot(c(1:10), xlab = '横轴', ylab = '纵轴', main = '中文标题 Title', family = 'SimSun')
dev.off()

会得到如下输出:

Error in axis(side = side, at = at, labels = labels, ...) : 字体类别出错
此外: Warning messages:
1: In axis(side = side, at = at, labels = labels, ...) :PostScript字体数据库里找不到'SimSun'这个字体系列.........

错误原因提示的也很清楚,生成pdf文件的图形设备的字体数据库中找不到指定的字体,解决方案是通过pdf('test.pdf', family = 'GB1')设置pdf图形设备使用GB1字体,这会调用系统默认的中文字体,如果想要使用指定的中文字体,这种方法就不起作用了,这种情况下一种可能的方法是利用extrafont包注册特定的字体,然后调用Cario包的CarioPDF来生成pdf文件,但是这种方案比较繁琐,并且很容易失败。

比较好的解决方案是利用showtext包,使用起来非常简单,在此感谢此包的作者,使用方法如下:

library(showtext)
showtext.auto(enable = TRUE)
font.add('SimSun', 'simsun.ttc')
pdf('test.pdf')
plot(c(1:10), xlab = '横轴', ylab = '纵轴', main = '中文标题 Title', family = 'SimSun')
dev.off()

得到的pdf文件如下:
![Uploading 62a1a74efedab3a3855c3a78d1b7a882_854328.png . . .]

c76dfdecd4bc238f054e3c2f2892e1bc.png

showtext包理论上能够调用系统已安装的任何字体,完整的字体列表可以通过font.files()查看。

有强迫症的同学可能会注意到,标题中的中英文看起来很不协调,这是因为很多中文字体的英文部分不够美观,至于如何在同一行文字中同时使用中文字体和英文字体,会在最后介绍一种可行方法。

ggplot2显示中文字体

ggplot2的画图功能非常强大,初期不太容易上手,但是习惯了之后会发现真的好用,在此不做过多介绍,只关注显示中文的方法,和plot函数类似,如果只是希望显示中文或者保存为栅格图像,只需要在画图的时候设定family参数即可,一种可用的方法如下:

library(ggplot2)
ggplot(data.frame(x = rnorm(100))) +geom_histogram(aes(x), fill = 'purple', alpha = 0.6) +labs(x = 'X 取值', y = '频数 Count') +theme(text = element_text(family = 'SimSun'))

结果为:

62a1a74efedab3a3855c3a78d1b7a882.png

如果不通过theme(text = element_text(family = 'SimSun'))设定字体参数,则会出现中文乱码,同样,ggplot2能够对标题、坐标轴、坐标刻度等分别设置不同的字体,具体使用方法请参考ggplottheme函数。

如果需要将含有中文字体的图形保存为pdf文件,同样可以利用前面讲到的方案,最新版的showtext包已经支持了ggplot2,推荐使用此种方案。

中英文字体混合显示

前面啰啰嗦嗦的说了一大推,其实总结起来无非是在plot或者ggplot2theme中设定family参数,如需要保存为pdf文件,则利用showtext包添加字体即可。

但是有时候需要同时显示中文和英文,而plotggplot2对同一个元素的字体只能设置一种字体,因此可能的解决方案就是使用中英文混合字体,比如知名度很高的YaHei Consolas混合字体,然而最近由于要写毕业论文,需要黑体和Times New Roman的混合字体,网上搜了一圈没搜到,只能动手制作一个了。Google后发现了一个开源项目:FontForge, 其安装方法见官网说明,该项目能够很方便的用来合并中英文字体,这个开源项目在处理字体上功能很强大,有GUI和命令行两种使用方式,在Mac上其GUI依赖于X11,但是X11在最新版的Mac OS上存在诸多问题,因此还是推荐使用命令行,使用起来也非常简单,比如说我们想要合并黑体和Times New Roman,先把这两个字体的字体文件找出来,放在同一个文件夹下面,我这里的文件名分别为simhei.ttfTimesNewRoman.ttf,然后在同一个文件夹下面新建一个脚本文件mergefont.pe,内容如下:

Open("simhei.ttf")
SelectAll()
ScaleToEm(1024)
Generate("temp.ttf", "", 0x14)
Close()# Open English font and merge to the Chinese font
Open("TimesNewRoman.ttf")
SelectAll()
ScaleToEm(1024)MergeFonts("temp.ttf")
SetFontNames("Broman", "Broman", "SimHei Times New Roman Hybrid", "Regular", "")
Generate("Broman.ttf", "", 0x14)
Close()

如果已经成功的安装了fontforge,在命令行切换到当前目录并执行fontforge -script mergefont.pe,即可生成Broman.ttf字体文件,然后双击安装即可。

上述脚本中,第一段代码打开中文字体然后设置合适的缩放比例并保存到临时文件中,第二段代码打开英文字体并进行缩放,第三段代码将二者合并,然后设置合并后字体的名字,类别,描述等信息,并将其导出。FontForge功能强大,使用方便,并且目前还支持python脚本,http://fontforge.github.io/en-US/documentation/scripting/如有兴趣,可参考[FontForge Scripting](http://fontforge.github.io/en-US/documentation/scripting/)。

测试一下生成的Broman混合字体,代码如下:

library(ggplot2)
library(showtext)
showtext.auto(enable = TRUE)
font.add('Broman', 'Broman.ttf')
pdf('test.pdf')
ggplot(data.frame(x = rnorm(100))) +geom_histogram(aes(x), fill = 'purple', alpha = 0.6) +labs(x = 'X 取值', y = '频数 Count', title = '标题 Title') +theme(text = element_text(family = 'Broman'))
dev.off()

得到的pdf文件如下:

aa84fbb65641901bb50423c11e873c5e.png

可以看到中文字体显示为黑体,英文字体显示为Times New Roman, 至此,R画图的字体问题基本完美解决。

R画图中英文字体完美解决方案相关推荐

  1. R 语言画图中英文字体解决方案

    在某些时候,需要在 R 画图中添加中文,但是默认情况下,R 对中文的支持不好.这里推荐一个showtext的 R 包.如果需要将含有中文字体的图形保存为 pdf 文件,可以使用下面讲到的方案,最新版的 ...

  2. ttc转换ttf字体在线_R 语言画图中英文字体解决方案

    在某些时候,需要在 R 画图中添加中文,但是默认情况下,R 对中文的支持不好.这里推荐一个showtext的 R 包.如果需要将含有中文字体的图形保存为 pdf 文件,可以使用下面讲到的方案,最新版的 ...

  3. ubuntu英文情况下汉字不准确不标准.显示日文字体. 完美解决方案

    Ubuntu 16 开始默认中文字体从文泉驿换为了 Noto Sans CJK,但在英文的系统环境下的汉字显示不正确,部分汉字被显示为日文汉字形式. 比如说门 这是因为在英文环境下日语汉字优先于中文汉 ...

  4. c#鼠标点击TextBox控件后清空默认字体-完美解决方案

    方案(一) 脚本: <script type="text/javascript" language="javascript">         // ...

  5. MATLAB画图中英文不同字体混合显示标题、坐标轴标签(完美解决方案)

    MATLAB是吾等理工狗常用的求生工具.在画图时对中英文标题均支持较好,但学术出版物常常对字体有所要求.对于英文出版物一切好说,设置成相应字体即可.而对于中文出版物.中文毕业论文.报告,则常常需要混合 ...

  6. R语言-出图时的中英文字体解决方案

    目录 方案1- showtext 方案2-Cairo 在某些时候,需要在 R 画图中添加中文,但是默认情况下,R 对中文的支持不好. 方案1- showtext 这里推荐一个showtext的 R 包 ...

  7. 解决matplotlib(plt)的中英文字体混显问题

    matplotlib画图时,每句文本只使用一种字体进行显示.Times New Roman英文字体和宋体为常用字体,为同时显示这两种字体,翻阅了很多文章,终于找到一种完美的解决方案.即:合并中英文字体 ...

  8. 破译垃圾邮件“变脸”密码完美解决方案(转)

    破译垃圾邮件"变脸"密码完美解决方案(转) 不道德的电子邮件发送者可以不费多大成本或根本不费成本地分发大量消息,而正常用户却被迫花费一些时间和精力从他们的邮箱中清除这些欺诈性的或不 ...

  9. Android 适配底部返回键等虚拟键盘的完美解决方案

    这个问题来来回回困扰了我很久,一直没能妥善解决. 场景1:华为手机遮挡了屏幕底部. 场景2:进入应用时,虚拟键自动缩回,留下空白区域. 需求: 需要安卓能自适应底部虚拟按键,用户隐藏虚拟按键时应用要占 ...

最新文章

  1. 微软云计算业务增长,或成全球最具价值上市公司
  2. Java 多线程编程之 interruptException
  3. java高并发(五)并发模拟
  4. HarmonyOS之常用组件WebView的使用
  5. 华为任职资格_看了华为的任职资格体系,你就明白员工为啥这么拼?
  6. java bitset_Java BitSet and()方法与示例
  7. python使用python-barcode生成任意长度字符串的条形码(一维码)详细教程
  8. MyEclipse生成常用方法
  9. Qt学习笔记-使用shape() 使得碰撞更加精确
  10. hadoop3.2.2--记录java.io.IOException: All specified directories have failed to load.问题
  11. 存储维护和服务器的区别,存储服务器和普通服务器区别是什么? 你想知道吗服务器类型一般是什么...
  12. C语言根号作用,c语言开根号(开根号编程)
  13. 干眼能从事计算机工作吗,上班族长时间面对电脑须谨慎干眼症
  14. 130 个相见恨晚的超实用网站
  15. 谈谈你对ThreadLocal的理解
  16. Ubuntu系统中清理DNS缓存
  17. NVIDIA GeForce GTX 1060 驱动安装--------TensorFlow系列学习笔记(一)
  18. 当年谷歌为什么退出中国?
  19. TML5期末大作业:我的家乡网站设计——我的家乡大连 带登录注册表单 轮播
  20. 财务会计基础(一)概念

热门文章

  1. 第十九期基金定投-价值股又有起飞的迹象了
  2. Muduo 处理Tcp粘包
  3. 代码写入word时美化高亮
  4. 【经验之谈】一个已婚男人分享找老婆的经验!
  5. 步进电机c语言源代码 stm32,stm32 42步进电机基本旋转实现内含源代码
  6. php中级工程师必备知识点,初级到中级 PHP开发工程师实用知识图谱
  7. 关于STC8A8K64S4A12(STC15系列升级版)例程中程序出现 'xxx' undefined identifier的问题解决办法
  8. 【2021流量主】365王者打卡前后台源码
  9. Python实现“层次分析法”及“自调节层次分析法”
  10. 计算机一级网页制作教程视频教程,0626 网页设计与制作31讲,教学视频,湖南铁道职业技术学院陈承欢...