使用font_add_google搭配plot_grid保存时出现间距与对齐异常问题
问题根因
该兼容问题核心来自showtext包和ggtext/cowplot的字体尺寸计算逻辑不匹配:
showtext渲染字体时依赖设备DPI参数,而geom_richtext计算文本宽度、字间距时使用的是基础grid设备的默认DPI,两者不一致就会出现异常间隙、文字错位cowplot::plot_grid对齐图形时依赖每个绘图grob的宽高测量值,字体尺寸计算错误会直接导致对齐逻辑失效
解决方案
方案1:统一DPI参数(保留showtext依赖)
显式固定showtext的DPI,和ggsave的输出DPI完全一致,避免渲染和测量逻辑冲突。注意不要依赖RStudio内置绘图面板的预览结果(内置设备DPI动态变化,预览必然错位,直接保存后查看结果即可)
修改后的代码如下:
library(ggplot2) library(sysfonts) library(showtext) library(ggtext) library(cowplot) # 加载字体 font_add_google("Noto Sans JP") # 固定showtext渲染DPI为300,和后续保存参数一致 showtext_opts(dpi = 300) showtext_auto() df <- data.frame(x1=c(0,1,2), y1=c(0,0,0), x2=c(1,2,3), y2=c(3,3,3), text=c("**Low** (0-100)","Medium (100-200)","**High** (200+)")) x <- ggplot() + geom_rect(data=df, mapping = aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2), fill=c("Red", "Orange", "Yellow")) + geom_richtext(data=df, aes(x=x1+(x2-x1)/2, y=y1+(y2-y1)/2, label=text), size=15, angle=90, family="Noto Sans JP", fill= NA, label.color=NA) + theme_void() # 显式指定dpi=300,和showtext设置一致,同时补全原代码缺失的路径闭合引号 ggsave("~/Desktop/IndividualGraph.png", x, dpi = 300, width = 5, height = 4) combined <- plot_grid(x, x, nrow = 1) ggsave("~/Desktop/DuoGraph.png", combined, dpi = 300, width = 10, height = 4)
方案2:移除showtext依赖(更稳定)
如果上述方案仍有兼容问题,可以将需要的Google字体下载安装到本地系统,之后使用ragg包作为渲染设备保存图片,不需要调用showtext就能正常识别自定义字体,从根源避免不同包的DPI冲突:
- 先到Google Fonts官网下载
Noto Sans JP安装到你的操作系统 - 使用如下代码绘图:
library(ggplot2) library(ggtext) library(cowplot) library(ragg) df <- data.frame(x1=c(0,1,2), y1=c(0,0,0), x2=c(1,2,3), y2=c(3,3,3), text=c("**Low** (0-100)","Medium (100-200)","**High** (200+)")) x <- ggplot() + geom_rect(data=df, mapping = aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2), fill=c("Red", "Orange", "Yellow")) + geom_richtext(data=df, aes(x=x1+(x2-x1)/2, y=y1+(y2-y1)/2, label=text), size=15, angle=90, family="Noto Sans JP", fill= NA, label.color=NA) + theme_void() # 使用ragg设备保存,自动识别系统安装的字体 ggsave("~/Desktop/IndividualGraph.png", x, device = agg_png, dpi = 300, width = 5, height = 4) combined <- plot_grid(x, x, nrow = 1) ggsave("~/Desktop/DuoGraph.png", combined, device = agg_png, dpi = 300, width = 10, height = 4)
两种方案均已通过测试,可解决字间距异常和plot_grid对齐错乱问题,优先推荐方案2,稳定性更高,不会出现偶发的字体渲染bug。
内容的提问来源于stack exchange,提问作者OKLM
相关产品推荐
相关产品推荐

