如何在ggplot柱状图中为每组柱子添加非0观测值数量?
在ggplot2柱状图柱子上方添加对应组的非0观测值数量
问题分析
你需要给柱状图的每个柱子上方标注对应支出类别的非0观测数,但当前使用的mean.ind.exp是汇总后的均值数据,不包含非0观测数的统计信息,且stat_n_text的用法不符合需求。解决核心是先从原始数据计算非0观测数,再将其合并到绘图数据中,最后用geom_text完成标注。
步骤1:计算非0观测数(基于原始数据)
假设你有包含所有观测的原始数据集raw_data(含name和dollars字段),用dplyr统计每个组的非0观测数:
library(dplyr) # 统计每个支出类别的非0观测数 non_zero_counts <- raw_data %>% group_by(name) %>% summarise(n_non_zero = sum(dollars != 0)) # 将统计结果合并到现有均值数据中 mean.ind.exp <- mean.ind.exp %>% left_join(non_zero_counts, by = "name")
步骤2:修改ggplot代码添加标注
将原代码中的stat_n_text替换为geom_text,并调整y轴范围避免文本超出:
library(ggplot2) ind.exp <- ggplot(mean.ind.exp, aes(reorder(name, -mean.dollars), mean.dollars)) + geom_bar(stat = "summary", alpha = 1) + # 添加非0观测数标注,vjust控制垂直位置 geom_text(aes(label = paste0("n=", n_non_zero)), vjust = -0.5, size = 5, color = "black") + scale_y_continuous(labels = scales::label_dollar(), expand=expansion(mult=c(0, 0.15))) + scale_x_discrete(labels=c('ATV/拖拉机','补充饲料/种植地','资本改良', '土地管理', '财产税', '薪资','设备维护', '招待', '种雄鹿','繁殖母鹿','其他支出','野生动物调查', '广告','DMP合规')) + labs(title='白尾鹿相关土地所有者支出', y = "平均支出", x= '支出类别') + theme(plot.title = element_text(hjust = 0.5, size=30, face="bold"), axis.text.x = element_text(size=30, colour = "black", angle = 30, vjust=0.5), axis.text.y = element_text(size=30, colour = "black"), axis.title = element_text(size=30, face='bold')) + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "black")) + theme(plot.margin = margin(2, 4, 2, 2, "cm")) ind.exp
关键说明
- 如果原始数据结构不同,需调整
non_zero_counts的统计逻辑,确保sum(dollars != 0)能正确统计非0观测数 vjust = -0.5控制文本在柱子上方的距离,可根据实际柱子高度调整数值- 扩大
scale_y_continuous的expand参数(从0.1改为0.15)是为了避免顶部标注超出绘图区域
内容的提问来源于stack exchange,提问作者JLD475
相关产品推荐
相关产品推荐

