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/

R绘图字体解决方案(转)的更多相关文章

  1. R绘图基础

    一,布局 R绘图所占的区域,被分成两大部分,一是外围边距,一是绘图区域. 外围边距可使用par()函数中的oma来进行设置.比如oma=c(4,3,2,1),就是指外围边距分别为下边距:4行,左边距3 ...

  2. r绘图基本

    R绘图命令分为三种类型: 高级绘图命令在图形设备上产生一个新的图区,它可能包括坐标轴,标签,标题等等. 低级画图命令会在一个已经存在的图上加上更多的图形元素,例如额外的点,线和标签. 交互式图形命令允 ...

  3. 基础R绘图

    前言: 在前面介绍了R的基础入门语法之后,现也将最近整理好的一些R的基础绘图实例提供给需要的朋友参考.(温馨提示:代码慎用!按照本博文实例进行练习的话最好能做到举一反三.代码多敲方为上策,切不可隔岸观 ...

  4. IText 中文字体解决方案 生成doc文档

    IText生成doc文档需要三个包:iTextAsian.jar,iText-rtf-2.1.4.jar,iText-2.1.4.jar 亲测无误,代码如下: import com.lowagie.t ...

  5. R: 绘图 barplot

    问题:barplot 18.5.16 怎么绘制 barplot,用两种方式:基础绘图 & ggplot2解决方案: 基础绘图 barplot(height, width = 1, space ...

  6. [游戏学习24] MFC 各种绘图 字体学习

    >_<:这里包含字体设置及各种绘图,只要稍微看一下代码就能理解,这里不多介绍 >_<:Hello.h #include<afxwin.h> class CMyApp ...

  7. Android Canvas不能换行,或者不识别\n,\r\n的解决方案

    在使用Canvas绘制文本的时候,如果要绘制的字符串含有\r\n,\n换行的时候,会识别不出来,当成空格绘制出来. 解决方案: 1.使用StaticLayout来实现,具体代码如下: TextPain ...

  8. R绘图 第十二篇:散点图(高级)

    散点图用于描述两个连续性变量间的关系,三个变量之间的关系可以通过3D图形或气泡来展示,多个变量之间的两两关系可以通过散点图矩阵来展示. 一,添加了最佳拟合曲线的散点图 使用基础函数plot(x,y)来 ...

  9. CentOS6.5下实现R绘图

    1.首先安装R的绘图包Cairo 下载地址:http://www.rforge.net/Cairo/files/ [root@Hadoop-NN-01 mysofts]# R CMD INSTALL ...

随机推荐

  1. Android 布局(线性布局、相对布局)

    一.线性布局(LinearLayout) <LinearLayout****</LinearLayout>1. orientation(布局方向)value=0 horizontal ...

  2. java 基础知识五 数组

    java  基础知识五  数组 数组保存的是一组有顺序的.具有相同类型的数据. 同一个数组中所有数据元素的数据类型都是相同的. 可以通过数组下标来访问数组,数据元素根据下标的顺序,在内存中按顺序存放 ...

  3. jdk8的新特性 Lambda表达式

    很多同学一开始接触Java8可能对Java8 Lambda表达式有点陌生. //这是一个普通的集合 List<Employee> list = em.selectEmployeeByLog ...

  4. 大麦盒子(domybox)无法进入系统解决方案!【简单几步】

    大麦无法进入系统解决方案![简单几步]前提准备:电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个路由器下的网络! 前提准备:电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个路由 ...

  5. Java 别名(Aliasing)

    别名 (Aliasing) 别名,顾名思义,是有别于现在名字的另一个名字,但指的是不是同一个人或事物呢?比如,你上学的时候同学有没有给你起什么外号?如果有的话,你的名字和同学给你起的外号是不是都指的是 ...

  6. java面试题(一)

    1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注 ...

  7. 对GPIO_Init(GPIOx,&GPIO_InitStructure)的理解

    今天学习stm32流水灯程序的时候,看到了"GPIO_Init(GPIOB, &GPIO_InitStructure)"这个函数,参数1"GPIOB"很 ...

  8. 我们一起学Docker(一)

    一.什么是Docker? Docker是一个基于LXC(Linux Container,Linux容器),以及cgroup的上层工具,通过对LXC,cgroup及相关系统命令的封装,使得用户可以非常方 ...

  9. Linux-进程描述(5)之进程环境

    main函数和启动例程 当内核使用一个exec函数执行C程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序将此例程指定为程序的起始地址.启动例程从内核获取命令行参数和环境变量,然后为调 ...

  10. selenium操作拖拽实现无效果的替代方案

    如果碰到这种情况,无论你是直接通过draganddrop()还是分步执行clickandhold(),dragtoelement(),或通过by_offset位移都无法实现元素拖拽.只能物理模拟了 w ...