You need to enable JavaScript to run this app. RMarkdown中ggplot2设置中文坐标轴标签导出PDF出现乱码问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 21:06:00