You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何为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

火山引擎 最新活动