You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Rmd转为PDF时ggraph报invalid font type错误求助

解决knitr转PDF时ggraph字体错误问题

问题原因

PDF渲染对字体的要求比HTML/RStudio更严格,你代码里的family="sans"在LaTeX环境下可能无法被正确解析,加上size=1300的异常大数值,触发了字体加载失败。

解决方案

1. 修正字体与字号设置

把geom_node_text里的参数调整为LaTeX兼容的配置,移除冲突的family,并设置合理字号:

geom_node_text(aes(filter = Pos == "CEO", label = Name, fontface="bold"), size=5)

2. 用extrafont包确保字体可被PDF识别

如果需要指定特定字体,先安装并注册系统字体:

# 安装包
install.packages("extrafont")
library(extrafont)
# 导入系统字体(首次运行耗时较长)
font_import()
# 加载字体
loadfonts(device = "pdf")
# 之后在geom_node_text中指定已注册的字体,比如:
geom_node_text(aes(filter = Pos == "CEO", label = Name, fontface="bold"), family="Helvetica", size=5)

3. 使用showtext包简化字体处理

showtext能让ggplot2在PDF中直接使用系统字体,无需复杂配置:

install.packages("showtext")
library(showtext)
# 加载字体
font_add_google("Roboto", "sans")
showtext_auto()

# 绘图代码中指定family="sans"即可
geom_node_text(aes(filter = Pos == "CEO", label = Name, fontface="bold", family="sans"), size=5)

修改后的完整代码示例

library(ggraph)
library(showtext)

# 配置showtext
font_add_google("Roboto", "sans")
showtext_auto()

ggraph(enron_weighted_und, layout = "stress") +
  geom_edge_link0(aes(edge_width = weight), edge_colour = "grey66") +
  geom_node_point(aes(fill = clu, size = degree **2), shape = 21) +
  geom_node_text(aes(filter = Pos == "CEO", label = Name, fontface="bold", family="sans"), size=5) +
  scale_fill_manual(values = colour_palette) +
  scale_edge_width_continuous(range = c(0.1, 2.5)) +
  scale_size_continuous(range = c(1, 6)) +
  theme_graph() + 
  theme(legend.position = "bottom")

关键说明

  • 避免设置极端字号(比如1300),PDF会严格按照数值渲染,导致字体加载异常。
  • theme_graph()自带适配PDF的主题,尽量减少手动指定字体family,避免冲突。
  • extrafont和showtext二选一即可,showtext更适合快速导入网络字体或系统字体。

内容的提问来源于stack exchange,提问作者AnonymUser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:10:42