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

如何在RStudio中为Spaghetti图拟合多项式回归曲线?

在Spaghetti图上添加拟合回归曲线的解决方案

我来帮你搞定在lattice绘制的Spaghetti图上添加拟合曲线的问题~首先得说,你之前尝试用base绘图的plot和lines是行不通的,因为lattice属于网格图形系统,和base绘图系统是完全独立的,没法直接混用。下面给你两种靠谱的实现方式:

方法一:在lattice中直接添加拟合线

1. 添加整体数据的Lowess平滑曲线

直接在xyplot的panel参数里自定义绘图逻辑,先画原始的Spaghetti线,再叠加lowess拟合线:

library(lattice)

xyplot(GCIP ~ time_since_on, 
       groups = Patient, 
       type = 'b', 
       data = data_head,
       panel = function(x, y, ...) {
         # 先绘制每个患者的点和线
         panel.xyplot(x, y, ...)
         # 计算并添加整体的lowess平滑线
         smooth_line <- lowess(x, y)
         panel.lines(smooth_line$x, smooth_line$y, col = "red", lwd = 2)
       })

2. 添加多项式回归拟合线(比如二次多项式)

先拟合回归模型,生成预测值,再把拟合线加到图里:

# 第一步:拟合二次多项式模型
poly_model <- lm(GCIP ~ poly(time_since_on, 2), data = data_head)

# 第二步:生成用于预测的x序列(让拟合线更平滑)
x_pred <- seq(min(data_head$time_since_on), max(data_head$time_since_on), length.out = 100)
y_pred <- predict(poly_model, newdata = data.frame(time_since_on = x_pred))

# 第三步:绘制图形并叠加拟合线
xyplot(GCIP ~ time_since_on, 
       groups = Patient, 
       type = 'b', 
       data = data_head,
       panel = function(x, y, ...) {
         panel.xyplot(x, y, ...)
         panel.lines(x_pred, y_pred, col = "blue", lwd = 2, lty = 2) # 虚线区分
       })

3. 给每个患者单独添加拟合线

如果需要给每个分组(Patient)都加一条自己的拟合线,可以用panel.superpose来处理分组:

xyplot(GCIP ~ time_since_on, 
       groups = Patient, 
       type = 'b', 
       data = data_head,
       panel = function(x, y, groups, ...) {
         panel.superpose(x, y, groups = groups,
                         panel.groups = function(x, y, ...) {
                           # 绘制当前组的点和线
                           panel.xyplot(x, y, type = 'b', ...)
                           # 添加当前组的lowess拟合线
                           group_smooth <- lowess(x, y)
                           panel.lines(group_smooth$x, group_smooth$y, 
                                       col = current.panel.colors()$col, 
                                       lwd = 1.5)
                         })
         # 可选:添加一条整体的拟合线作为参考
         overall_smooth <- lowess(x, y)
         panel.lines(overall_smooth$x, overall_smooth$y, col = "black", lwd = 2, lty = 3)
       })

方法二:用ggplot2实现(更直观易读)

如果你愿意换用ggplot2,代码结构会更清晰,添加拟合线也更简单:

library(ggplot2)

# 1. Spaghetti图 + 整体lowess平滑线
ggplot(data_head, aes(x = time_since_on, y = GCIP, group = Patient, color = Patient)) +
  geom_point() +
  geom_line() +
  geom_smooth(method = "loess", se = FALSE, color = "red", lwd = 1.5) + # 关闭置信区间
  theme_bw()

# 2. Spaghetti图 + 二次多项式拟合线
ggplot(data_head, aes(x = time_since_on, y = GCIP, group = Patient, color = Patient)) +
  geom_point() +
  geom_line() +
  geom_smooth(method = "lm", formula = y ~ poly(x, 2), se = FALSE, color = "blue", lwd = 1.5) +
  theme_bw()

# 3. 给每个患者单独添加拟合线
ggplot(data_head, aes(x = time_since_on, y = GCIP, group = Patient, color = Patient)) +
  geom_point() +
  geom_line() +
  geom_smooth(method = "loess", se = FALSE, lwd = 1) + # 每个组自己的拟合线
  theme_bw()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:07:14