如何为ggplot2的geom_text设置Arial(Liberation Sans)字体?
非Windows环境下为ggplot2的geom_text设置Arial(Liberation Sans)字体的有效方法
问题原因
非Windows系统中,直接指定family = "Arial"会触发PostScript字体数据库找不到该字体的警告——因为系统里实际安装的是Arial的替代字体Liberation Sans,R的grid渲染系统无法自动关联两者,且常规的theme设置无法直接让geom_text继承字体配置。
有效解决方案
方案1:用showtext包映射并加载字体
showtext可以绕过系统字体数据库限制,直接加载TTF字体并映射为"Arial"名称,让ggplot2的所有文本元素统一使用该字体:
library(ggplot2) library(showtext) # 初始化showtext,让ggplot2使用其文本渲染引擎 showtext_auto() # 将Liberation Sans字体映射为"Arial"(需确保字体文件路径正确,可通过`fc-list | grep LiberationSans`查看) font_add("Arial", "LiberationSans-Regular.ttf") # 生成示例数据 set.seed(123) data <- data.frame( x = rnorm(20, mean = 50, sd = 10), y = rnorm(20, mean = 50, sd = 10), label = paste("P", 1:20, sep = "") ) # 绘图,无需在geom_text中重复指定family ggplot(data, aes(x = x, y = y)) + geom_point(color = "blue", size = 3) + geom_text(aes(label = label), vjust = -1, hjust = 0.5, size = 5, color = "red") + theme_minimal(base_family = "Arial") + labs(title = "Random Scatter Plot with Labels", x = "X-axis", y = "Y-axis")
方案2:直接使用Liberation Sans的原生字体名称
跳过映射步骤,直接指定系统识别的Liberation Sans字体名称,避免字体名称不匹配问题:
library(ggplot2) # 生成示例数据 set.seed(123) data <- data.frame( x = rnorm(20, mean = 50, sd = 10), y = rnorm(20, mean = 50, sd = 10), label = paste("P", 1:20, sep = "") ) # 绘图时直接指定真实字体名称 ggplot(data, aes(x = x, y = y)) + geom_point(color = "blue", size = 3) + geom_text(aes(label = label), vjust = -1, hjust = 0.5, size = 5, color = "red", family = "Liberation Sans") + theme_minimal() + theme(text = element_text(family = "Liberation Sans")) + labs(title = "Random Scatter Plot with Labels", x = "X-axis", y = "Y-axis")
方案3:用extrafont导入字体到R数据库(适合PDF输出)
如果需要输出带嵌入字体的PDF,可通过extrafont将Liberation Sans导入R的PostScript字体数据库:
# 首次使用需安装并导入字体 install.packages("extrafont") library(extrafont) font_import(pattern = "LiberationSans") # 仅导入Liberation Sans系列字体 loadfonts() # 加载字体数据库 # 绘图 library(ggplot2) set.seed(123) data <- data.frame( x = rnorm(20, mean = 50, sd = 10), y = rnorm(20, mean = 50, sd = 10), label = paste("P", 1:20, sep = "") ) ggplot(data, aes(x = x, y = y)) + geom_point(color = "blue", size = 3) + geom_text(aes(label = label), vjust = -1, hjust = 0.5, size = 5, color = "red", family = "Liberation Sans") + theme_minimal(base_family = "Liberation Sans") + labs(title = "Random Scatter Plot with Labels", x = "X-axis", y = "Y-axis") # 保存PDF时嵌入字体 ggsave("scatter_plot.pdf", device = cairo_pdf)
注意事项
- 可通过
fc-list | grep "Liberation Sans"命令在Linux系统中查看字体的准确名称和文件路径 - 若使用RStudio,修改字体配置后建议重启R会话确保生效
- 如果font_add找不到字体文件,可指定完整路径,例如
font_add("Arial", "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf")
内容的提问来源于stack exchange,提问作者Caterina




