大家在利用R语言来绘图的时候,不知道有没有经常被这种情况恼火,就是无论是基础绘图命令还是利用ggplot2工具包,都不能在画布上正常显示中文,也就是不支持中文字符。这也是许多R语言论坛和社区里,经常遇到的问题。下面将介绍我在这种问题上的三种处理方案。
一、前期准备
1. 所用软件与版本:R 4.0.5
2. 所需R包:ggplot2 , showtext, Cairo, extrafont
3. 示例数据:iris数据集
二、教程
2.1 方案一(showtext)
在这里我们需要的核心R包是showtext,在加载这个包的同时,他会自动载入sysfonts包,而showtext的处理思路是:我们先指定我们想要的字体样式,然后创造一个可以调用中文字体的环境,我们的绘图命令就在这个环境中运行,并且在绘图命令参数中调成我们指定的字体。
① 调用指定字体
font_add("myfont","C:/Windows/Fonts/simhei.ttf")
font_families()
这里font_add与font.add函数用法相同,都是sysfonts包里面的函数,其中第一个参数family是我们想要调用字体的名字(我们自己命名),第二个参数regular是这个字体的ttf文件位置。这里我选择的是黑体,由于这个ttf文件不在工作路径下,我就直接调用绝对路径。当然可以不止系统字体,我们也可以在网上下载其他字体来调用。
此时,font_families函数的输出结果可能是这样的:
Output
前面三种都是R可以直接拿来用的,后面的wqy-microhei是showtext自带的字体,myfont则是我们设置的字体(我们设置的黑体)。
② 使用指定字体
library(showtext)
font_add("myfont","C:/Windows/Fonts/simhei.ttf")
font_families()
showtext_auto() #select your fonts automaticly
color = c("#33B44A","#EE3536","#3A429B")
my_comparisons <- list( c("setosa", "versicolor"), c("versicolor", "virginica"), c("setosa", "virginica") )
sites = apply(iris[,-5], 2, function(x) max(x)+2.5)
i=colnames(iris)[1]
iris %>% ggplot(aes_string(x="Species",y=i,fill="Species"))+geom_violin()+
geom_boxplot(width=0.1,position=position_dodge(0.9),outlier.colour = NA,fill="white")+
theme_bw()+
theme(legend.position="none",
axis.text.x = element_text(hjust = 0.5, vjust = 0.5),
axis.text.y = element_text(hjust = 0.5, vjust = 0.5),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_text( size=rel(1)),
panel.border = element_blank(),
axis.line = element_line(colour = "black",size=1),
plot.title = element_text(family = "myfont",hjust = 0.5,size = 20)
)+scale_fill_manual(values = color)+
stat_compare_means( comparisons = my_comparisons)+
stat_compare_means(label.y = as.numeric(sites[i]))+
labs(title = "这是小提琴图")
ggsave("Fonts_text.pdf",height = 5,width = 5)
dev.off()
Use
其中,最关键的就是showtext_auto()函数,放在绘图命令前可以自动调用出我们设置的字体,然后就是常规的绘图。
值得注意的是,要在绘图命令中用family参数进行调用字体,例如ggplot里面element_text函数里面的family参数。此外关于上面的小提琴图绘制,可以参考我的这一篇文章:
2.2 方案二(extrafont, Cairo)
这种方案是直接导入系统中的所有字体在R中,具体操作是载入extrafont包后,输入font_import函数,如:
library(extrafont)
fonts()
font_import()
其中fonts函数是查看所有字体,而font_import()后,R就会让你判断是否载入,如果系统库中字体特别多,那么时间会比较长,可能需要几分钟,载入完成后,就可以结合Cairo包像上面的绘图命令一样来使用。
值得注意的是,每次注册字体库都只能在当前线程中使用,如果重启R线程需要重新载入,就是再运行一次loadfonts(device="win")。
然后我们借助于一个Cairo画布,它类似于pdf命令,这是一个图形设备,比如我们要做一个pdf,那就是CairoPDF命令,其中各个参数与使用pdf相同,如果我们要做一个png,那就是CairoPNG命令。Cairo由于是一个图形设备,他也可以与方案一连用。
方案二示例代码:
library(extrafont)
library(Cairo)
loadfonts(device="win")
CairoPDF("font_test.pdf",width = 5,height = 5)
color = c("#33B44A","#EE3536","#3A429B")
my_comparisons <- list( c("setosa", "versicolor"), c("versicolor", "virginica"), c("setosa", "virginica") )
sites = apply(iris[,-5], 2, function(x) max(x)+2.5)
i=colnames(iris)[1]
iris %>% ggplot(aes_string(x="Species",y=i,fill="Species"))+geom_violin()+
geom_boxplot(width=0.1,position=position_dodge(0.9),outlier.colour = NA,fill="white")+
theme_bw()+
theme(legend.position="none",
axis.text.x = element_text(hjust = 0.5, vjust = 0.5),
axis.text.y = element_text(hjust = 0.5, vjust = 0.5),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.title.x = element_blank(),
axis.title.y = element_text( size=rel(1)),
panel.border = element_blank(),
axis.line = element_line(colour = "black",size=1),
plot.title = element_text(family = "SimHei",hjust = 0.5,size = 20)
)+scale_fill_manual(values = color)+
stat_compare_means( comparisons = my_comparisons)+
stat_compare_means(label.y = as.numeric(sites[i]))+
labs(title = "这是小提琴图")
dev.off()
绘制出来的效果和方案一是一样的,注意在fonts()函数输出的,我们使用字体要对应上,比如大小写之类。个人推荐第一种方案,简单高效!
网友评论