RMarkdown中ggplot2设置中文坐标轴标签导出PDF出现乱码问题求助
问题根因
- 文档正文的中文渲染依赖ctex宏包,走LaTeX排版链路;但ggplot2生成的图片是独立的R端图形输出,和LaTeX的字体配置完全隔离,正文中文正常不代表绘图里的中文能正常显示。
- 最初的点状乱码,是因为默认的pdf设备不支持中文字形渲染;改成
dev: cairo_pdf后出现方块乱码,是因为cairo设备启动后没有匹配到含中文字形的字体,默认调用的西文字体缺少中文编码,最终输出缺字方块。
解决步骤
第一步:接入字体渲染适配模块
不依赖cairo的默认字体匹配逻辑,用showtext包主动接管R端的图形字体渲染,该方案跨Windows、macOS、Linux全平台兼容,不需要折腾系统级的R环境配置:
# 首次使用先安装showtext包:install.packages("showtext") library(showtext) # 开启自动适配RMarkdown编译流程的渲染开关 showtext_auto() # 加载本地已安装的中文字体(优先选开源无版权的中文字体,比如Noto Sans CJK SC、思源黑体,避免商用风险) font_add( family = "cjk-font", regular = "NotoSansCJK-Regular.ttc", bold = "NotoSansCJK-Bold.ttc" )
第二步:关联ggplot绘图的字体配置
所有文本元素统一指定刚才加载的中文字体,覆盖轴标签、刻度、标题等所有会出现中文的位置:
library(ggplot2) ggplot(cars, aes(speed, dist)) + geom_line() + xlab("速度\nSpeed") + ylab("距离\nDist") + # 全局指定文本使用的字体 theme(text = element_text(family = "cjk-font"))
第三步:核对现有YAML配置
现有YAML里的dev: cairo_pdf配置可以保留,不需要额外修改,只需要排查两个常见问题:
- 在R控制台执行
capabilities("cairo")确认R环境的cairo设备可用,返回值必须为TRUE - 不要在header-includes里加载和字体渲染冲突的宏包,避免编译时字体路径解析异常
常见踩坑提醒
- 不要直接把系统自带的西文字体(比如Times New Roman、Arial)指定为ggplot的全局字体,这类字体没有中文字形,一定会输出方块乱码
- 如果配置后仍有局部乱码,先清除RMarkdown项目文件夹下的
*_cache缓存目录,再重新编译 - showtext包对所有R图形输出设备都兼容,不需要额外调整PDF导出的参数
内容的提问来源于stack exchange,提问作者PeterPanPan
相关产品推荐
相关产品推荐

