You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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冲突:

  1. 先到Google Fonts官网下载Noto Sans JP安装到你的操作系统
  2. 使用如下代码绘图:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:57:04