ggplot2无需geom_segment实现分组均值点横线连接的方法
解决方案
你现有代码的stat_summary(fun = mean, geom="line")没有生效,是因为ggplot在离散x轴下默认不会自动按颜色分组连线,需要显式补充映射参数即可,除了geom_segment外有两种更简便的实现方式:
方法1:直接修改现有stat_summary参数
仅需要给画线的stat_summary补充group映射,同时对齐dodge宽度即可,修改后的完整绘图代码如下:
ggplot(data, aes(as.factor(presence), students, color=factor(year))) + geom_jitter(size=4, alpha=0.4, shape=16,position = position_jitterdodge(jitter.width = 0.1, dodge.width = 0.8)) + stat_summary( aes(color = year), fun=mean, fun.min = function(x) mean(x) - sd(x), fun.max = function(x) mean(x) + sd(x), geom = "pointrange", size = 0.4, position = position_dodge(0.8) ) + # 仅修改这一行,补充group和position参数 stat_summary(fun = mean, geom="line", aes(group = factor(year)), position = position_dodge(0.8))
注意:这里也给geom_jitter的position_jitterdodge补充了dodge.width=0.8,保证所有图层的分组偏移量统一,避免元素错位。
方法2:预计算均值后用geom_line连线
如果需要更可控的绘图逻辑,可以先聚合计算每个分组的均值,再直接用geom_line连线:
- 先计算分组均值:
library(dplyr) mean_df <- data %>% group_by(year, presence) %>% summarise( mean_stu = mean(students), sd_stu = sd(students), .groups = "drop" )
- 绘图时直接调用聚合后的数据画线:
ggplot(data, aes(as.factor(presence), students, color=factor(year))) + geom_jitter(size=4, alpha=0.4, shape=16,position = position_jitterdodge(jitter.width = 0.1, dodge.width = 0.8)) + stat_summary( aes(color = year), fun=mean, fun.min = function(x) mean(x) - sd(x), fun.max = function(x) mean(x) + sd(x), geom = "pointrange", size = 0.4, position = position_dodge(0.8) ) + geom_line(data = mean_df, aes(y = mean_stu, group = factor(year)), position = position_dodge(0.8))
内容的提问来源于stack exchange,提问作者LDT
相关产品推荐
相关产品推荐

