大家在利用R語(yǔ)言來(lái)繪圖的時(shí)候近刘,不知道有沒(méi)有經(jīng)常被這種情況惱火擒贸,就是無(wú)論是基礎(chǔ)繪圖命令還是利用ggplot2工具包,都不能在畫(huà)布上正常顯示中文觉渴,也就是不支持中文字符介劫。這也是許多R語(yǔ)言論壇和社區(qū)里,經(jīng)常遇到的問(wèn)題案淋。下面將介紹我在這種問(wèn)題上的三種處理方案蜕猫。
一、前期準(zhǔn)備
1. 所用軟件與版本:R 4.0.5
2. 所需R包:ggplot2 , showtext, Cairo, extrafont
3. 示例數(shù)據(jù):iris數(shù)據(jù)集
二哎迄、教程
2.1 方案一(showtext)
在這里我們需要的核心R包是showtext回右,在加載這個(gè)包的同時(shí)隆圆,他會(huì)自動(dòng)載入sysfonts包,而showtext的處理思路是:我們先指定我們想要的字體樣式翔烁,然后創(chuàng)造一個(gè)可以調(diào)用中文字體的環(huán)境渺氧,我們的繪圖命令就在這個(gè)環(huán)境中運(yùn)行,并且在繪圖命令參數(shù)中調(diào)成我們指定的字體蹬屹。
① 調(diào)用指定字體
font_add("myfont","C:/Windows/Fonts/simhei.ttf")
font_families()
這里font_add與font.add函數(shù)用法相同侣背,都是sysfonts包里面的函數(shù),其中第一個(gè)參數(shù)family是我們想要調(diào)用字體的名字(我們自己命名)慨默,第二個(gè)參數(shù)regular是這個(gè)字體的ttf文件位置贩耐。這里我選擇的是黑體,由于這個(gè)ttf文件不在工作路徑下厦取,我就直接調(diào)用絕對(duì)路徑潮太。當(dāng)然可以不止系統(tǒng)字體,我們也可以在網(wǎng)上下載其他字體來(lái)調(diào)用虾攻。
此時(shí)铡买,font_families函數(shù)的輸出結(jié)果可能是這樣的:
前面三種都是R可以直接拿來(lái)用的,后面的wqy-microhei是showtext自帶的字體霎箍,myfont則是我們?cè)O(shè)置的字體(我們?cè)O(shè)置的黑體)奇钞。
② 使用指定字體
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()
其中,最關(guān)鍵的就是showtext_auto()函數(shù)漂坏,放在繪圖命令前可以自動(dòng)調(diào)用出我們?cè)O(shè)置的字體景埃,然后就是常規(guī)的繪圖。
值得注意的是顶别,要在繪圖命令中用family參數(shù)進(jìn)行調(diào)用字體谷徙,例如ggplot里面element_text函數(shù)里面的family參數(shù)。此外關(guān)于上面的小提琴圖繪制筋夏,可以參考我的這一篇文章:
[ggplot2]小提琴圖經(jīng)驗(yàn)總結(jié) - 簡(jiǎn)書(shū) (jianshu.com)
2.2 方案二(extrafont, Cairo)
這種方案是直接導(dǎo)入系統(tǒng)中的所有字體在R中,具體操作是載入extrafont包后图呢,輸入font_import函數(shù)条篷,如:
library(extrafont)
fonts()
font_import()
其中fonts函數(shù)是查看所有字體,而font_import()后蛤织,R就會(huì)讓你判斷是否載入赴叹,如果系統(tǒng)庫(kù)中字體特別多,那么時(shí)間會(huì)比較長(zhǎng)指蚜,可能需要幾分鐘乞巧,載入完成后,就可以結(jié)合Cairo包像上面的繪圖命令一樣來(lái)使用摊鸡。
值得注意的是绽媒,每次注冊(cè)字體庫(kù)都只能在當(dāng)前線(xiàn)程中使用蚕冬,如果重啟R線(xiàn)程需要重新載入,就是再運(yùn)行一次loadfonts(device="win")是辕。
然后我們借助于一個(gè)Cairo畫(huà)布囤热,它類(lèi)似于pdf命令,這是一個(gè)圖形設(shè)備获三,比如我們要做一個(gè)pdf旁蔼,那就是CairoPDF命令,其中各個(gè)參數(shù)與使用pdf相同疙教,如果我們要做一個(gè)png棺聊,那就是CairoPNG命令。Cairo由于是一個(gè)圖形設(shè)備贞谓,他也可以與方案一連用限佩。
方案二示例代碼:
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()
繪制出來(lái)的效果和方案一是一樣的,注意在fonts()函數(shù)輸出的经宏,我們使用字體要對(duì)應(yīng)上犀暑,比如大小寫(xiě)之類(lèi)。個(gè)人推薦第一種方案烁兰,簡(jiǎn)單高效耐亏!