如何使用R语言ggplot包绘制spaghetti plot(面条图)
R语言绘制纵向数据面条图(Spaghetti Plot)实现方案
你可以用ggplot2包快速实现按患者分组的轨迹连线图,步骤如下:
- 数据预处理
你提供的示例数据中value列为字符型,需要先转为数值类型,同时固定时间点的排序避免绘图时坐标轴顺序错乱:
# 加载绘图依赖包 library(ggplot2) # 构建示例数据 data <- data.frame( Study_ID = c("100","100","100","200","200","200","300","300","300"), time_point = c("Time1","Time2","Time3","Time1","Time2","Time3","Time1","Time2","Time3"), value = c("15","50","120","20","35","150","35","67","95") ) # 类型转换 data$value <- as.numeric(data$value) data$Study_ID <- as.factor(data$Study_ID) # 固定时间点水平顺序 data$time_point <- factor(data$time_point, levels = c("Time1", "Time2", "Time3"))
- 基础版面条图绘制
核心是将Study_ID映射到group美学参数,即可为每个患者生成独立的轨迹线,同时可通过颜色区分不同患者:
ggplot(data, aes(x = time_point, y = value, group = Study_ID, color = Study_ID)) + geom_line(linewidth = 1) + # 绘制个体轨迹线 geom_point(size = 2) + # 可选:在每个观测点添加标记点 labs( x = "观测时间点", y = "测量值", color = "患者ID" ) + theme_bw() # 使用简洁白底主题
- 进阶优化(匹配常见科研绘图样式)
如果需要在个体轨迹基础上突出总体变化趋势,可以叠加总体均值线,同时将个体轨迹调淡避免视觉杂乱:
ggplot(data, aes(x = time_point, y = value, group = Study_ID, color = Study_ID)) + geom_line(linewidth = 0.8, alpha = 0.7) + geom_point(size = 2, alpha = 0.7) + # 叠加总体均值趋势线,用黑色加粗虚线突出 stat_summary(aes(group = 1), fun = mean, geom = "line", color = "black", linewidth = 1.5, linetype = "dashed") + labs( x = "观测时间点", y = "测量值", color = "患者ID" ) + theme_classic()
提示:如果你的时间点是连续数值(比如随访天数、治疗周数),无需将时间点转为因子,直接映射到x轴即可自动按连续尺度排布连线。
内容的提问来源于stack exchange,提问作者sabc04
相关产品推荐
相关产品推荐

