查看原文
其他

如何给你画的图选一个看起来舒服的字体?

博文 生信者言 2022-03-29

 

不知道大家有没有遇到过,在R中使用中文,是特别头疼的一件事,不是报错就是乱码。


我想要这样,结果成了这样……,欲哭无泪有木有……


 

这是因为R 的很多图形设备只能使用一些标准的字体,但它们往往不包含中文的字符。而包含中文的字体,如宋体、黑体等,R 又不知道如何使用它们。


不过现在有了一个showtext包可以帮我们解决这个问题,showtext可以自动加载系统内的字体,也可以调用google字体库中的字体。当然我们也可以自己下载任意的字体,加载使用。


其实showtext加载系统字体是内部调用了sysfonts包,这个包有个函数:

 

font.add(family, regular, ...)

 

参数family是你给这个字体赋予的名称,在后面的绘图命令中你将通过它来引用这个字体。参数regular是字体文件的路径,如果字体在系统的标准位置(例如 Windows 的 C:\Windows\Fonts)或是当前的工作目录,则可以直接输入文件名。例如,在 Windows系统下,以下命令将导入系统中的楷体文件,并给它取名为“kaishu”:

 

font.add("kaishu", "simkai.ttf")

 

当然sysfonts还提供了一个调用google字体库(http://www.google.com/fonts

)的函数,当然,由于某些原因,此网站可能打不开……:


font.add.google(name, family = name, …)


参数name就是google字体库中的名称,参数family是你要赋予的名称,比如:

font.add.google("Schoolbell", "bell")

  

添加完字体之后,可以使用font.families()函数来查看当前可用的字体名称,不出意外的话,可以看到自己添加的字体已经在系统中了:


 

showtext包的安装,大家可以在CRAN上找到:


https://cran.r-project.org/web/packages/showtext/index.html

 

install.packages("showtext")


睁大你的眼睛,一大波靓图来袭

 



以上图片来源于https://github.com/yixuan/showtext

 

showtext的用法比较简单,目前有两种方法调用:


  • 函数showtext.begin()和showtext.end()。我们需要做的就是把绘图的命令包含在这两个语句中间,然后在适当的地方选取字体即可。

  • 函数showtext.auto(),直接放在绘图开头。

 

孙老湿举栗子

 

library(ggplot2)library(ggthemr)library(showtext)pdf("xx.pdf", height = 4, width = 6)font.add("heiti", "simhei.ttf")  #加载系统内的字体,并命名为heitishowtext.begin()     #开始调用字体ggthemr("flat")p <- ggplot(cars, aes(speed, dist)) +  geom_point() +  labs(title = "你好,世界", family = "heiti") +   #设置字体为heiti  theme(plot.title = element_text(size = 20))print(p)dev.off()showtext.end()                 #调用结束 



下面的例子是在github上的盗图,供学习:


library(showtext)## Loading Google fonts (http://www.google.com/fonts)font.add.google("Gochi Hand", "gochi")font.add.google("Schoolbell", "bell")font.add.google("Covered By Your Grace", "grace")font.add.google("Rock Salt", "rock")## Automatically use showtext to render text for future devicesshowtext.auto()set.seed(123)x= rnorm(10)y=1+ x + rnorm(10, sd=0.2)y[1] =5mod= lm(y ~ x) ## Plotting functions as usual## Open a graphics device if you want, e.g.## png("demo.png", 700, 600, res = 96) op= par(cex.lab=2, cex.axis=1.5, cex.main=2)plot(x, y, pch=16, col="steelblue",     xlab="X variable", ylab="Y variable", family="gochi")grid()title("Draw Plots Before You Fit A Regression", family="bell")text(-0.5, 4.5, "This is the outlier", cex=2, col="steelblue",     family="grace")abline(coef(mod))abline(1, 1, col="red")par(family="rock")text(1, 1, expression(paste("True model: ", y == x +1)),     cex=1.5, col="red", srt=20)text(0, 2, expression(paste("OLS: ", hat(y) ==0.79* x +1.49)),     cex=1.5, srt=15)legend("topright", legend= c("Truth", "OLS"), col= c("red", "black"), lty=1) par(op)

 

      

 

 

需要注意的是,如果用Rstudio工作界面,可能在绘图区看不到字体的效果,需要保存成文件,在查看。

 


当然还有更好玩的字体设置,有兴趣可以供参考:


https://cosx.org/2014/01/showtext-interesting-fonts-and-graphs



 

有任何问题,欢迎在文末留言讨论。



/End.


 

扫码关注,获取更多精彩内容

喜马拉雅FM搜索并订阅:生信者言;收听内容:

《一分钟听懂NGS基础概念》,让生信分析不再遥不可及

《亲爱的姑娘,你值得被温柔以待》,11个真实的人物故事

《众病之王:癌症传》,一起聆听人类对抗癌症的斗争史

回复文字:果然科学,看一篇好玩的科普文。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存