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

R Markdown绘制回归图添加模型注释时出现parse文本解析错误

报错原因

报错由两处问题直接导致:

  1. 开启parse=TRUE时,ggplot使用R原生plotmath规则解析文本,不支持LaTeX格式的$符号包裹公式,也不支持在annotate的label参数中直接传占位符额外拼接参数,解析到$位置时会直接触发意外输入错误。
  2. 原代码设置的标注坐标x=0, y=0.05完全在ggeffects默认生成的图坐标轴范围外,即便语法正确标注也无法正常显示。
修正方案
  • 提前提取模型中需要展示的β值、标准误、p值,用sprintf()提前拼接符合plotmath语法规则的标注字符串,不要混用LaTeX格式标记
  • 调整标注坐标到绘图区域的可视范围内,预留底部边距并关闭裁剪避免标注被切掉
  • plotmath语法中普通文本用单引号包裹,希腊字母直接写对应英文名称(如β写为beta),不同文本片段用*连接,不要用$包裹公式段。
可复现修正代码
# 加载依赖包
library(ggeffects)
library(ggplot2)

id <- rep(1:50)
tst <- c(sample(7:9, 50, replace = T))

mydf <- data.frame(id, tst)
mydf$age <- sample(40:90, 50, replace = T)
mydf$bmi <- sample(20:30, 50, replace = T)
mydf$sex <- sample(1:2, 50, replace = T)

# 拟合模型
model <- lm(tst ~ age*sex + bmi, data = mydf)
model_res <- summary(model)
# 提前提取年龄主效应对应的统计量
age_coef <- coef(model)[2]
age_se <- model_res$coefficients[2, 2]
age_p <- model_res$coefficients[2, 4]

# 生成边际效应预测结果
model.df <- ggpredict(model, terms = c("age", "sex"))

# 拼接符合解析规则的标注文本
plot_note <- sprintf("'年龄主效应: ' * beta == %.2f * ',' * 标准误 == %.2f * ',' * p值 == %.3f",
                     age_coef, age_se, age_p)

# 绘图
model.plot <- plot(model.df) +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5),
        # 预留底部标注空间
        plot.margin = margin(b=20)) +
  annotate(
    "text",
    x = min(model.df$x) + 2, # x轴靠左位置
    y = min(model.df$predicted) - 0.15, # y轴靠下位置
    parse = TRUE,
    size = 4,
    hjust = 0,
    label = plot_note
  ) +
  # 关闭裁剪避免标注被切掉
  coord_cartesian(clip = "off")

print(model.plot)
可选优化

如果需要把标注固定在图件最底部、完全不受数据波动影响,可以使用grid::textGrob()配合annotation_custom()实现绝对位置定位,不需要反复调整坐标适配数据范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:27:33