在R的ggplot2网格分面中为子组添加均值汇总点
解决方案
要在每个分面单元格中添加对应分组(按cyl)的双轴均值点,你需要显式指定stat_summary的分组依据,覆盖默认的按x轴变量分组的行为,同时自定义函数计算mpg和disp的均值。以下是符合需求的代码:
library(ggplot2) data(mtcars) ggplot(mtcars, aes(x = mpg, y = disp, color = factor(cyl))) + geom_point() + facet_grid(vs ~ am) + stat_summary( # 指定分组:按分面变量(vs、am) + cyl分组,确保每个分面每个cyl组计算整体均值 aes(group = interaction(vs, am, cyl)), geom = "point", # 自定义函数返回每个分组的mpg和disp均值 fun.data = function(df) data.frame( x = mean(df$mpg), y = mean(df$disp), ymin = mean(df$disp), ymax = mean(df$disp) # 满足stat_summary的参数要求,无实际意义 ), size = 3, shape = 24, fill = "red" )
关键说明
- 分组控制:通过
group = interaction(vs, am, cyl)强制按分面的两个定性变量和cyl分组,避免默认按mpg的单个取值分组。 - 双轴均值计算:使用
fun.data自定义函数,同时计算每个分组的mpg(x轴)和disp(y轴)均值,返回包含x、y的数据框。 - 颜色映射:继承主图层的
color = factor(cyl)设置,不同cyl的均值点会显示对应颜色,符合你“按颜色分别显示均值”的需求。
如果需要每个分面单元格的整体均值(不按cyl分组),只需将group改为interaction(vs, am),并固定均值点颜色:
ggplot(mtcars, aes(x = mpg, y = disp, color = factor(cyl))) + geom_point() + facet_grid(vs ~ am) + stat_summary( aes(group = interaction(vs, am)), geom = "point", fun.data = function(df) data.frame( x = mean(df$mpg), y = mean(df$disp), ymin = mean(df$disp), ymax = mean(df$disp) ), size = 3, shape = 24, fill = "red", color = "black" )
内容的提问来源于stack exchange,提问作者kwadratens
相关产品推荐
相关产品推荐

