R ggplot2散点图如何用stat_summary正确绘制分组均值点
问题描述
针对每个处理组tmt,需要在ggplot2中使用stat_summary函数绘制匹配分组填充色的均值点,但运行代码后原始散点上叠加了多个重复均值点,未按分组正确生成单个组均值点,需要修正该问题。
原始问题代码
df <- data.frame(x = rnorm(12, 4,1), y = rnorm(12, 6,4), tmt = rep(c("A","B","C"), each = 4)) ggplot(aes(x = x, y = y, fill = tmt), data = df) + geom_point(shape=21, size=5, alpha = 0.6) + scale_fill_manual(values=c("pink","blue", "purple")) + stat_summary(aes(fill = tmt), fun = 'mean', geom = 'point', size = 5) + scale_fill_manual(values=c("pink","blue", "purple"))
效果对比
- 未添加均值点的基础散点图效果:

- 运行完整代码后的异常效果:

问题原因
出现重复均值点有两个核心原因:
- 分组逻辑错误:x轴是连续型数值变量,未显式指定分组变量时,ggplot会默认按「x轴唯一值+fill映射变量」作为分组单元,每个原始x值都会单独触发统计量计算
- 统计计算逻辑错误:仅指定
fun = 'mean'时,stat_summary只会计算y轴的均值,x轴直接沿用每个原始观测的x值,不会自动聚合到组级别的x均值位置,最终每个原始点的x位置都会生成一个y等于组y均值的重复点
另外代码中重复写了两次scale_fill_manual,会产生冗余警告,只需要保留一次即可。
修正方案
自定义汇总函数同时计算组内x和y的均值,显式指定按tmt分组,同时给均值点指定shape=21保证填充色映射生效,修正后代码如下:
# 自定义组均值计算函数,同时返回x、y的组均值 get_group_mean <- function(data) { data.frame( x = mean(data$x), y = mean(data$y) ) } df <- data.frame(x = rnorm(12, 4,1), y = rnorm(12, 6,4), tmt = rep(c("A","B","C"), each = 4)) ggplot(aes(x = x, y = y, fill = tmt), data = df) + geom_point(shape=21, size=5, alpha = 0.6) + scale_fill_manual(values=c("pink","blue", "purple")) + # 显式指定分组为tmt,用自定义函数计算组中心位置,指定shape=21匹配填充色规则 stat_summary(aes(group = tmt), fun.data = get_group_mean, geom = 'point', shape = 21, size = 5)
运行后每个处理组只会在组散点的中心位置生成一个匹配填充色的均值点,不会出现重复点问题。
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

