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

ggplot2中向散点图添加样条回归拟合线时的报错解决

BS样条回归拟合线与置信带添加到散点图的解决方案

问题重现

使用BS样条构建年龄与细菌携带率的回归模型:

fit2 <- lm(percentage ~ bs(Age_midpoint, knots = c(0.177, 1, 1.460, 2.585, 5, 8.75, 37.45)), data = Complete_data)
age <- range(Complete_data$Age_midpoint)
Age_grid <- seq(from=min(age), to = max(age))
pred2 <- predict(fit2, newdata = list(Age_midpoint = Age_grid), se = T)
se_bands = with(pred2, cbind("upper" = fit+2*se.fit, "lower" = fit-2*se.fit))

基础散点图代码:

Fig1 <- ggplot(Complete_data, aes(x= Age_midpoint, y = percentage)) + 
  geom_point(shape=1, aes(size = denominator)) + 
  xlab("Average age") + 
  ylab("Pneumococcal Carriage") + 
  theme_light()

尝试添加拟合线和置信带时触发报错:

Fig1 + geom_line(aes(x = Age_midpoint.grid, y=pred2$fit), color = "red") + 
  geom_ribbon(aes(x = Age_midpoint.grid, ymin=se_bands[, "lower"], ymax = se_bands[, "upper"]), alpha = 0.3) + 
  xlim(age)

错误信息:

Error in geom_line(aes(x = Age_midpoint.grid, y = pred2$fit), color = "red") : 
ℹ Error occurred in the 2nd layer.
Caused by error in `check_aesthetics()`:
! Aesthetics must be either length 1 or the same as the data (403)
✖ Fix the following mappings: `x` and `y`

问题原因

  • 代码中错误引用了未定义的变量Age_midpoint.grid,实际应为Age_grid
  • geom_line和geom_ribbon默认沿用主图的数据集(共403行),但传入的拟合值、置信带向量长度与主数据集不一致,导致美学映射长度不匹配

解决步骤

  • 步骤1:将预测结果整理为独立数据框
    把年龄网格、拟合值、置信带上下限整合到一个数据框中,方便ggplot调用:
pred_df <- data.frame(
  Age_midpoint = Age_grid,
  fit = pred2$fit,
  lower = se_bands[, "lower"],
  upper = se_bands[, "upper"]
)
  • 步骤2:修改ggplot图层代码
    在geom_line和geom_ribbon中通过data参数指定预测数据框,确保变量名与映射匹配:
Fig1 + 
  geom_line(data = pred_df, aes(x = Age_midpoint, y = fit), color = "red") + 
  geom_ribbon(data = pred_df, aes(x = Age_midpoint, ymin = lower, ymax = upper), alpha = 0.3) + 
  xlim(age)

执行以上代码后,就能正确将BS样条的拟合线和置信带叠加到散点图中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:40:17