使用facet_wrap为每个分面添加动态分组均值标注的问题
解决ggplot分面直方图显示分组均值的问题
问题背景
现有示例数据:
sample_data <- data.frame(nros=rnorm(20,mean=5,sd=2),group=rep(c("A","B","C","D"),5))
需求是通过facet_wrap按group分面绘制直方图,并为每个分面添加对应分组的nros变量均值文本。但使用以下代码时,所有分面显示的是全局均值而非分组均值:
sample_data %>% ggplot(aes(x=nros))+geom_histogram()+ geom_vline(aes(xintercept=mean(nros)),color="blue", linetype="dashed", size=1)+xlim(0,30)+ geom_text(aes(x=mean(nros)+3,label=mean(nros),y=0.2))+facet_wrap(~group)
问题原因
直接在geom_vline和geom_text中使用mean(nros)时,该计算是基于整个数据集的全局均值,并未按分面的group分组计算,导致所有分面显示同一个值。
解决方案
以下两种方法均可实现按分面显示对应分组的均值:
方法一:提前计算分组均值
先按group分组计算每个组的nros均值,再在绘图时调用该数据集:
# 计算分组均值 group_means <- sample_data %>% group_by(group) %>% summarise(mean_nros = mean(nros)) # 绘图 sample_data %>% ggplot(aes(x = nros)) + geom_histogram() + # 调用分组均值数据绘制垂直线 geom_vline(data = group_means, aes(xintercept = mean_nros), color = "blue", linetype = "dashed", size = 1) + # 添加分组均值文本,保留两位小数更美观 geom_text(data = group_means, aes(x = mean_nros + 3, label = round(mean_nros, 2), y = 0.2)) + xlim(0, 30) + facet_wrap(~group)
方法二:使用stat_summary自动计算分组均值
利用stat_summary自动按分面分组计算均值,无需提前预处理数据:
sample_data %>% ggplot(aes(x = nros)) + geom_histogram() + # 用stat_summary绘制均值垂直线 stat_summary(geom = "vline", fun = mean, aes(xintercept = after_stat(x)), color = "blue", linetype = "dashed", size = 1) + # 用stat_summary添加均值文本 stat_summary(geom = "text", fun = mean, aes(x = after_stat(x) + 3, label = round(after_stat(x), 2), y = 0.2)) + xlim(0, 30) + facet_wrap(~group)
内容的提问来源于stack exchange,提问作者user3483060
相关产品推荐
相关产品推荐

