将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
相关产品推荐
相关产品推荐

