R绘图字体解决方案(转)
2016-04-14 16:53
429 查看
COS论坛里面经常会遇到的一个问题就是绘图时中文字体怎么解决。最初,一个流行的方法是使用
上面那幅图所有的代码如下,当然要事先将其中用到的四个字体文件放到工作目录下。
其实也就两步:先用
就可以加载宋体。
加载完了字体,R本身还不知道如何使用它们,所以,绘图的语句需要包含在一对
注意
------------------------------------------------------------------------------------------------------------
前两天把 showtext 包更新到了 0.4-1 版本。因为这次更新的内容比较多,所以简单写篇博客介绍下。
第一个比较重大的改变是现在可以在图形设备中自动使用
自动调用的另一个好处是能在
要关闭自动调用功能,只需执行
第二个比较显著的改进是更好地支持了位图图形。在之前的版本中,
支持位图图形也就意味着支持了窗口设备,比如
最后一个改进其实是之前
其他的例子和说明都可以参见 Github 上的介绍。
转自:http://yixuan.cos.name/cn/2015/04/showtext-new-version/
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/
相关文章推荐
- 对象的克隆
- JAVA多线程学习笔记
- logstash2.2.0过滤tomcat日志
- 初入程序员的某一天
- Android活动的四种启动方式(standard singleTop singleTask singleInstance)
- Spring中的Mybatis基础
- cocos2d-x 3.4 eclipse android 编译是出现WindowsError: [Error 5] 的解决方法 assets
- TimesTen 应用层数据库缓存学习:6. Aging策略
- TimesTen 应用层数据库缓存学习:5. 异步读写缓存
- UIAutomator测试工具的配置以及使用
- dispatch_sync死锁问题研究
- 判断sql是否存在特定的对象
- 第八种循环
- Swift笔记:字典
- Universal-ImageLoader的基本配置和如何加载图片
- 问题: alerview的按钮点击时,某些view动画不会执行
- Android应用打破65K方法数限制,让你的应用不再爆棚
- 十个随机数求和 三
- 十个随机数求和 四
- Android While 循环导致的资源占用过高进而导致程序崩溃问题