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

使用ggplot2重绘growthcurver模型图时数值匹配问题求助

解决growthcurver模型图用ggplot2重绘与原plot结果不一致的问题

问题背景

用growthcurver包拟合生长曲线后,用基础plot()函数能得到平滑的拟合曲线,但自行编写的ggplot2代码只能画出原始数据点连接的折线,和原结果不符。相关数据、代码如下:

原始数据与模型拟合代码

data <- data.frame(
  time = c(0,1,2,3,4,5,6,7,8,24),
  T1 = c(0.01666667, 0.06, 0.12, 0.34, 0.29666667, 0.34, 1.23666667, 2.21333333, 2.64333333, 3.89)
)

model <- growthcurver::SummarizeGrowth(data$time, data$T1)

原基础plot效果

执行plot(model)会生成一条覆盖整个时间范围的平滑拟合曲线,同时展示原始观测点。

失败的ggplot2尝试代码

library(tibble)
library(ggplot2)

tibble(t = data$time, pred = model$model$m$fitted(), N = data$T1) |>
  ggplot(aes(t, pred)) +
  geom_point(aes(y = N)) +
  geom_line()

这段代码仅用原始数据的10个时间点计算预测值,连接后得到的是折线,而非原plot的平滑曲线。

问题原因

growthcurver的plot方法默认会生成连续的密集时间序列(不是仅用输入的原始时间点)来计算模型预测值,从而绘制出平滑曲线。而你的ggplot代码只调用了原始数据点的拟合值,自然只能得到离散折线。

解决方案

生成覆盖原始时间范围的连续时间序列,用模型预测这些点的数值,再用ggplot绘制即可。

修正后的ggplot2代码

library(tibble)
library(ggplot2)

# 生成连续时间序列:从0到24,间隔0.1,覆盖原时间范围
t_seq <- seq(min(data$time), max(data$time), by = 0.1)

# 用模型预测连续时间点的数值
pred_vals <- predict(model$model$m, newdata = data.frame(time = t_seq))

# 构建绘图数据框
plot_data <- tibble(
  t = t_seq,
  pred = pred_vals,
  obs_t = data$time,
  obs_N = data$T1
)

# 绘制ggplot图
ggplot(plot_data) +
  geom_point(aes(x = obs_t, y = obs_N)) +  # 原始观测点
  geom_line(aes(x = t, y = pred), color = "red") +  # 平滑拟合曲线
  labs(x = "Time", y = "OD") +
  theme_bw()

效果说明

这段代码会生成和基础plot完全一致的平滑拟合曲线,同时保留原始观测点,完美替代基础plot的展示效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:45:36