使用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
相关产品推荐
相关产品推荐

