ggplot2重复测量图:叠加平均轨迹与误差条的实现方法
重复测量轨迹图合并实现方案
问题描述
已绘制两张重复测量得分图表:第一张为所有受试者的个体得分轨迹图,第二张为组平均得分及误差条图,需要将平均轨迹和误差条叠加到个体轨迹图上。

现有代码
# 重命名变量用于数据重塑 names(data_wide) [names(data_wide) == "score.baseline"] <- "score.0" names(data_wide) [names(data_wide) == "score.wave1"] <- "score.1" names(data_wide) [names(data_wide) == "score.wave2"] <- "score.2" names(data_wide) [names(data_wide) == "score.wave3"] <- "score.3" # 宽表转长表 data_long <- reshape(as.data.frame(data_wide), idvar="ID", varying=c("score.0", "score.1", "score.2", "score.3"), direction="long") # 计算分组统计量 data_long.group <- data_long %>% group_by(time) %>% summarise( score_mean = (mean(score, na.rm=TRUE)), score_sd = (sd(score, na.rm=TRUE)) ) # 绘制个体得分轨迹 ggplot(data_long, aes(x = factor(time), y = score, color = as.factor(ID), group = ID)) + geom_line(size=0.2) + theme_classic(base_size = 18) + theme(legend.position = "none") + labs(title = "Trajectories", y = "data score", x = "Wave") # 绘制组均值与标准差误差条 ggplot(data_long.group, aes(x = time, y = score_mean)) + geom_line(size=0.2) + theme_classic(base_size = 18) + theme(legend.position = "none") + labs(title = "Trajectories", y = "data score", x = "Wave") + geom_errorbar(aes(ymin=score_mean-score_sd, ymax=score_mean+score_sd), width=.2, position=position_dodge(0.05))
示例数据
data_wide <- structure( list(ID = c(1, 2, 3, 4, 5, 6), score.baseline = c(4, 4, 5, 4, 6, 4), score.wave1 = c(3.5, 5.67, 5.33, 4, 6.67, 4.5), score.wave2 = c(4, 5, NA, 4, 6.67, 4), score.wave3 = c(6, 6, 4.67, 4.33, 6.67, 3)), row.names = c(1L, 2L, 3L, 4L, 5L, 6L), class = c("data.frame"))
实现方法
核心修改逻辑
- 统一两个图层的x轴类型,避免坐标轴不匹配
- 将个体轨迹特有的映射规则(按ID分组、按ID上色)放到对应图层内,不影响全局映射
- 显式指定叠加图层的数据源,单独设置均值线、误差条的样式便于和个体轨迹区分
修改后可运行代码
# 先将汇总数据的time转成因子,和个体数据的x轴类型对齐 data_long.group$time <- factor(data_long.group$time) ggplot(data_long, aes(x = factor(time), y = score)) + # 绘制个体轨迹 geom_line(aes(color = as.factor(ID), group = ID), size=0.2) + # 叠加组均值线,黑色加粗突出显示 geom_line(data = data_long.group, aes(y = score_mean, group = 1), color = "black", size = 1) + # 叠加标准差误差条 geom_errorbar(data = data_long.group, aes(y = score_mean, ymin=score_mean-score_sd, ymax=score_mean+score_sd), width=.2, color = "black", position=position_dodge(0.05)) + theme_classic(base_size = 18) + theme(legend.position = "none") + labs(title = "Trajectories", y = "data score", x = "Wave")
内容的提问来源于stack exchange,提问作者AEP
相关产品推荐
相关产品推荐

