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

使用ggtext设置ggplot标题出现字距异常,是已知Bug还是用法有误?

ggtext标题字距不规则问题的原因与解决方案

这是showtext与ggtext渲染机制冲突导致的已知问题,并非你误用了库。

问题原因

showtext通过将字体转换为位图进行渲染,而ggtext的element_markdown()基于grid系统处理文本布局,二者在字距计算逻辑上存在适配偏差,最终导致部分位置字距异常。

解决方案

方案一:替换showtext为systemfonts加载字体

systemfonts使用系统原生字体渲染逻辑,与ggtext兼容性更好,示例代码:

library(tidyverse)
library(systemfonts)
library(ggtext)

# 加载Google字体
font_add_google("Public Sans", "Public Sans")

p1 <- mtcars %>% 
  ggplot(aes(wt, mpg)) +
  geom_point() +
  theme_minimal(base_family = "Public Sans") +
  labs(
    title =  "Lorem ipsum dolor sit amet, vel vel est donec nulla nam aliquet in in auctor. Sed dolor orci aliquet nunc" 
  ) +
  theme(
    plot.title = element_markdown()
  )

ggsave(
  plot = p1,
  filename = "mtcars plot.pdf",
  width = 11.3,
  height = 4.5
)

方案二:调整showtext渲染参数(部分场景有效)

通过设置常规屏幕DPI参数,缓解位图渲染带来的字距偏差:

library(tidyverse)
library(showtext)
library(ggtext)

font_add_google("Public Sans")
showtext_opts(dpi = 96) # 新增DPI适配设置

p1 <- mtcars %>% 
  ggplot(aes(wt, mpg)) +
  geom_point() +
  theme_minimal(base_family = "Public Sans") +
  labs(
    title =  "Lorem ipsum dolor sit amet, vel vel est donec nulla nam aliquet in in auctor. Sed dolor orci aliquet nunc" 
  ) +
  theme(
    plot.title = element_markdown()
  )

showtext_auto()
ggsave(
  plot = p1,
  filename = "mtcars plot.pdf",
  width = 11.3,
  height = 4.5
)

方案三:放弃markdown格式(无需富文本时)

若标题不需要markdown富文本功能,改用原生文本元素即可避免冲突:

theme(
  plot.title = element_text(family = "Public Sans")
)

内容的提问来源于stack exchange,提问作者tomw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:07:09