MacOS High Sierra下ggplot2导出PDF时轴标签短破折号显示异常
解决MacOS High Sierra下ggplot2导出PDF时en-dash显示为连字符的问题
这问题我之前在Mac上做可视化时也踩过坑——quartz里显示好好的en-dash,一导出PDF就变成普通连字符,本质是默认PDF导出后端对Unicode特殊字符的支持不够,而Quartz用的是Mac原生渲染,能正常调用系统字体的特殊字形。给你几个实用的解决办法:
方法1:改用Cairo PDF后端导出
默认的pdf()函数基于PostScript,对Unicode字符支持有限,换成cairo_pdf()就能解决大部分特殊字符显示问题,它对Unicode的兼容性更好:
# 先绘制你的图形 fit1 <- lm(y ~ x, data.df) p1 <- ggplot(data.df, aes(x=x, y=y)) + geom_point() + geom_abline(intercept = coef(fit1)[[1]], slope = coef(fit1)[[2]], color="red", size=.2) + xlab("CMP Left–Right Score") + ylab("Disposition Towards BI") # 用cairo_pdf导出 cairo_pdf("your_plot.pdf", width = 6, height = 4) # 可自定义尺寸 print(p1) dev.off()
方法2:明确指定支持en-dash的字体 + 使用Unicode转义符
有时候直接输入的en-dash可能因为编码问题在导出时丢失,换成Unicode转义符\u2013更稳妥,同时指定一个系统里存在且支持特殊字符的字体(比如Helvetica Neue、Arial):
p1 <- ggplot(data.df, aes(x=x, y=y)) + geom_point() + geom_abline(intercept = coef(fit1)[[1]], slope = coef(fit1)[[2]], color="red", size=.2) + xlab("CMP Left\u2013Right Score") + # 用Unicode转义符代替直接输入的en-dash ylab("Disposition Towards BI") + theme(text = element_text(family = "Helvetica Neue")) # 指定支持特殊字符的字体 # 再用pdf()或cairo_pdf()导出都可以 pdf("your_plot.pdf") print(p1) dev.off()
方法3:用extrafont包导入系统字体到R
如果上面的方法还不行,可以用extrafont把Mac系统字体导入到R的PDF设备中,确保导出时能调用到正确的字体:
# 安装并加载extrafont包 install.packages("extrafont") library(extrafont) # 导入系统字体(第一次运行会比较久,耐心等) font_import() # 加载字体到PDF设备 loadfonts(device = "pdf") # 绘图时指定字体 p1 <- ggplot(data.df, aes(x=x, y=y)) + geom_point() + geom_abline(intercept = coef(fit1)[[1]], slope = coef(fit1)[[2]], color="red", size=.2) + xlab("CMP Left–Right Score") + ylab("Disposition Towards BI") + theme(text = element_text(family = "Arial")) # 选择你导入的字体 # 导出PDF pdf("your_plot.pdf") print(p1) dev.off()
简单总结下:Quartz正常显示是因为它用Mac原生渲染,直接调用系统字体;而默认PDF导出用的PostScript字体集不全,所以会把en-dash替换成普通连字符。上面三种方法里,方法1最简单直接,优先试试~
内容的提问来源于stack exchange,提问作者Lindsay
相关产品推荐
相关产品推荐

