在R中使用Cairo绘图时指定字体无法生效的问题咨询
解决Cairo设备下无法应用Windows字体的问题
我懂你遇到的这个麻烦——换用Cairo解决了绘图抗锯齿的问题,结果之前能用的Cambria字体突然失效了。其实这是因为Cairo图形设备不买windowsFonts()创建的字体别名的账,它得直接调用系统字体的真实名称才行。
下面是具体的解决思路和修改后的代码:
问题根源
windowsFonts()是给R原生的Windows图形设备用的字体映射工具,但Cairo(包括你用的CairoWin())是跨平台的设备,它直接读取系统里安装的字体原名,不支持这种别名映射。
解决步骤
直接使用字体真实名称
Cambria的系统字体名就是"Cambria",你不用再通过windowsFonts()创建Cam别名,直接在theme里指定这个原名就行。确认字体名称(可选)
如果不确定某个字体的真实名称,可以用sysfonts包来排查:install.packages("sysfonts") library(sysfonts) font_files() %>% filter(grepl("Cambria", family))运行后就能看到Cambria的准确名称。
修改后的完整代码
library(readxl) library(scales) library(ggplot2) library(dplyr) library(Cairo) # 数据读取与预处理 dataset <- read_excel('CW Data.xlsx') colnames(dataset)[4] <- "Broadband Subs (%)" options(scipen = 1000) # 使用CairoWin绘图,直接指定Cambria字体 CairoWin() ggplot(dataset, aes(x=`2019 GDP ($bn)`, y=`2019 FDI ($m)`)) + geom_point(size=3, shape=1) + geom_smooth(method='lm', formula=y~x, se=FALSE, color='black') + scale_x_continuous(label = comma) + scale_y_continuous(label=comma) + theme(panel.background = element_rect(fill="peachpuff"), plot.background = element_rect(fill="peachpuff")) + theme(panel.grid.major = element_line(colour = "gray72"), panel.grid.minor = element_line(colour = "gray72")) + theme(text = element_text(family = "Cambria")) # 直接使用字体真实名称 ggsave("FDI~GDP.png", device="png", type = "cairo")
额外提示
- 确保你的Windows系统里已经安装了Cambria字体(Windows默认自带,若缺失可通过官方渠道安装)。
- 如果导出图片时字体还是有问题,可以在
ggsave里额外指定字体:ggsave("FDI~GDP.png", device="png", type = "cairo", family="Cambria")
内容的提问来源于stack exchange,提问作者Ryan Walter
相关产品推荐
相关产品推荐

