R Markdown绘制回归图添加模型注释时出现parse文本解析错误
报错原因
报错由两处问题直接导致:
- 开启
parse=TRUE时,ggplot使用R原生plotmath规则解析文本,不支持LaTeX格式的$符号包裹公式,也不支持在annotate的label参数中直接传占位符额外拼接参数,解析到$位置时会直接触发意外输入错误。 - 原代码设置的标注坐标
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
相关产品推荐
相关产品推荐

