如何在ggplot2分组均值图中添加学校整体均值线?
解决方法
要实现按学校分图,同时保留type分组均值线并添加学校整体的pre/post均值线,需要先预处理数据计算学校各时间点的均值,再结合分面和geom_line实现,具体步骤如下:
- 预处理数据:计算每个学校在
pre和post阶段的整体均值
library(dplyr) # 计算各学校各时间点的values均值 school_mean <- data %>% group_by(school, time) %>% summarise(school_values = mean(values), .groups = "drop")
- 绘制基础分面图:用
facet_wrap按学校拆分图表,保留原type分组的均值线
library(ggpubr) p1 <- ggline(data, x = "time", y = "values", color = "type", add = "mean", palette = c("#bb00af", "#00bb6a"), # 对应ctr和exp两个分组的颜色 facet_wrap(~school)) # 按学校分图
- 添加学校整体均值线:使用预处理后的
school_mean数据,指定正确的分组和颜色
p1 + geom_line(data = school_mean, aes(x = time, y = school_values, color = "school_mean"), group = 1, # 确保pre和post的均值点能连成线 linewidth = 1) + # 与现有均值线样式保持一致 # 手动设置颜色和图例标签 scale_color_manual(values = c("#bb00af", "#00bb6a", "#7393B3"), labels = c("ctr", "exp", "学校整体均值")) + labs(color = "分组") # 调整图例标题
关键说明
- 你之前的代码错误在于:直接使用
mean(data$values)是整个数据集的均值,而非分学校分时间的均值;group = type无法正确连接pre和post的点,需要指定group = 1来确保两个时间点的均值能连成一条线;同时缺少按学校分面的设置,导致无法为每个学校单独展示。 - 最终图表会按
school1和school2分成两个子图,每个子图里包含ctr、exp的分组均值线,以及蓝色的学校整体均值线,图例也会同步更新。
内容的提问来源于stack exchange,提问作者Anita-
相关产品推荐
相关产品推荐

