Quarto转PDF时ggplot2轴标签δ与千分号‰显示异常问题
解决Quarto中ggplot2轴标签千分号(‰)PDF导出异常的问题
问题本质
你遇到的‰显示为省略号的问题,核心是LaTeX默认的pdfLaTeX引擎对Unicode字符支持有限,即便指定了Arial Unicode MS字体,ggplot的expression()函数会触发LaTeX表达式渲染,导致‰无法被正确解析。另外注意到你代码里x、y轴标签都写了δ¹⁵N,应该是x轴为δ¹³C的笔误,下面会一并修正。
解决步骤
- 放弃
expression(),直接用Unicode字符定义标签:避免LaTeX解析表达式时的字符兼容问题,直接写δ¹³C (‰)这类原生Unicode文本。 - 切换Quarto的PDF引擎为XeLaTeX/LuaLaTeX:这两个引擎对Unicode字体支持更完善,能正确识别并渲染‰和希腊字母。
- 明确指定ggplot主题的字体:确保轴标签、标题等元素使用你指定的Arial Unicode MS字体。
修改后的完整代码
首先是Quarto文档的YAML配置:
--- title: "同位素组成月分布Biplot" format: pdf: engine: xelatex mainfont: "Arial Unicode MS" fontsize: 12pt ---
然后是R绘图代码:
library(readxl) library(dplyr) library(ggplot2) # 读取数据并过滤异常值(合并为一次过滤更简洁) sia_data_plot <- read_excel("~/filepath/doc.xlsx") %>% filter(d13C < max(d13C), d15N < max(d15N)) # 绘图 sia_month_facet <- ggplot(data = sia_data_plot, aes(x = d13C, y = d15N)) + geom_point(aes(color = Tissue, shape = Transect), size = 3) + # 仅保留一次facet_wrap,指定月份展示顺序 facet_wrap(~factor(Month, levels=c('March', 'June', 'August', 'October'))) + scale_colour_brewer(type = "seq", palette = "Dark2") + ggtitle("Isotopic composition biplot by month") + # 直接用Unicode字符写轴标签,无需expression labs(x = "δ¹³C (‰)", y = "δ¹⁵N (‰)") + theme_grey() + # 强制指定字体,确保字符渲染一致 theme( axis.title.x = element_text(family = "Arial Unicode MS"), axis.title.y = element_text(family = "Arial Unicode MS"), plot.title = element_text(family = "Arial Unicode MS") ) print(sia_month_facet)
额外提示
- 原代码中两次调用
facet_wrap,后面的会覆盖前面的设置,所以只保留指定月份顺序的那一行即可。 - 如果你的系统找不到Arial Unicode MS字体,可以替换为其他支持希腊字母和千分号的Unicode字体,比如"Noto Sans"。
- XeLaTeX引擎是解决问题的关键,pdfLaTeX对非ASCII字符的支持先天不足,必须切换到Unicode友好的引擎才能解决‰渲染异常。
内容的提问来源于stack exchange,提问作者AlexaQuinoa
相关产品推荐
相关产品推荐

