您的位置:首页 > 其它

R绘图字体解决方案(转)

2016-04-14 16:53 429 查看
COS论坛里面经常会遇到的一个问题就是绘图时中文字体怎么解决。最初,一个流行的方法是使用
family = "GB1"
,但一般这样做出来的图比较难看,而且并没有完全解决问题。后来发现了Cairo包,喜大普奔,但后来又发现它选字体的时候不太明确,也就是说我不知道怎样才能选中我想要的那个字体。再然后,Winston Chang写了extrafont包,功能很完善,但需要系统里面安装Ghostscript。我是懒人,不想花时间在配置Ghostscript上,于是写了一个叫做
showtext
的包。(好像哪里不对)


showtext
详细的说明写在我的英文博客里面,四级的词汇量,很好懂的。这里就简单说明一下用法,因为用法挺简单的。

上面那幅图所有的代码如下,当然要事先将其中用到的四个字体文件放到工作目录下。

library(showtext)
library(Cairo)

font.add("newrocker", "newrocker.ttf")
font.add("aerofoil", "aerofoil.ttf")
font.add("xkcd", "xkcd.ttf")
font.add("nextdoor", "thegirlnextdoor.woff")

CairoPNG("showtext.png", 640, 400)
showtext.begin()
plot(1, type = "n", family = "xkcd", cex.axis = 1.5, cex.lab = 1.5)
text(1, 1.2, "showtext 0.2", cex = 5, family = "nextdoor",
col = "#F8766D")
text(1, 0.8, "has been released!", cex = 5, family = "newrocker",
col = "#00BFC4")
title("Free to use fonts", family = "aerofoil", cex.main = 2)
showtext.end()
dev.off()


其实也就两步:先用
font.add()
加载字体,然后用
showtext.begin()
showtext.end()
把绘图语句包含进来。

font.add()
的第一个参数是绘图时字体的系列名(family),也就是告诉R如何在绘图时引用这个字体。第二个参数是字体的路径,如果字体在工作目录下就直接打字体名。当然,操作系统一般都会有一些默认的字体安装位置,
showtext
(实际上是其依赖的sysfonts包)会尝试搜索这些路径。在Windows下,直接输入

font.add("songti", "simsun.ttc")


就可以加载宋体。

加载完了字体,R本身还不知道如何使用它们,所以,绘图的语句需要包含在一对
showtext.begin()
showtext.end()
中间。这时候只需要指定合适的
family
参数就可以使用这些字体了。

showtext
自带了文泉驿微米黑字体,如果只是想在图中使用中文,只需要加载
showtext
,然后使用
showtext.begin()
showtext.end()
即可。

注意
showtext
只对当前打开的图形设备有效,如果当前没有图形设备,或是设备已关闭,
showtext
都是不起作用的。

showtext
的开发页面在https://github.com/yixuan/showtext,欢迎到那里拍砖捉虫。在此留言亦可,重谢。

------------------------------------------------------------------------------------------------------------

前两天把 showtext 包更新到了 0.4-1 版本。因为这次更新的内容比较多,所以简单写篇博客介绍下。

第一个比较重大的改变是现在可以在图形设备中自动使用
showtext
了,用法比以前更为简单。在这个版本之前,需要每次都打开图形设备,调用
showtext.begin()
showtext.end()
,然后关闭图形设备。这样反复调用函数显得非常麻烦。在新版本中,只要在最开始调用一下
showtext.auto()
,之后所有的图形设备就会自动使用
showtext
来进行渲染。这对窗口设备尤其重要,因为我们平常用 R 画图时,很少手动去调用
windows()
或是
x11()
,而是直接使用
plot()
函数让 R 自动打开一个窗口。调用了
showtext.auto()
之后,窗口设备也可以自动使用载入的字体了,这对于预览图形效果会很有帮助。

自动调用的另一个好处是能在
ggsave()
中使用
showtext
了。
ggsave()
本身会自动打开和关闭图形设备,所以在以前的版本中我们无法在
ggsave()
中插入
showtext.begin()
。现在自动化以后,
ggsave()
也可以使用
showtext
的字体库了。

要关闭自动调用功能,只需执行
showtext.auto(FALSE)


第二个比较显著的改进是更好地支持了位图图形。在之前的版本中,
showtext
主要用于矢量图,比如
pdf()
或者
svg()
。如果在
png()
或是
jpeg()
中使用
showtext
,你会发现画出的字体非常难看。这是因为那些位图设备没有较好的抗锯齿支持。而现在,
showtext
可以为那些设备绘制好平滑后的字形,所以图片质量也会得到提升。唯一需要注意的是要保持图形设备的 DPI 与
showtext
的一致,比如用
png()
设备时,应该手动设置一下想要的分辨率(此处 DPI 为120)

library(showtext)
showtext.opts(dpi = 120)
png(..., res = 120)


支持位图图形也就意味着支持了窗口设备,比如
windows()
x11()


最后一个改进其实是之前
sysfonts
包的更新内容,就是目前在国内无法直接连接 Google 的字体库,所以在使用
font.add.google()
时,可以使用 360 提供的代理。使用方法是加一个参数,比如

library(showtext)
font.add.google("Gochi Hand", "gochi", repo = "useso")


其他的例子和说明都可以参见 Github 上的介绍

转自:http://yixuan.cos.name/cn/2015/04/showtext-new-version/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: