RStudio中按年龄组绘制含数量与占比的分组柱状图问题
解决你的ggplot柱状图问题
直接可用的修改后代码
library(ggplot2) library(scales) # 用于处理百分比格式 p1 <- ggplot(data = people, aes(x = AgeGroup, fill = sex)) + geom_bar(position = position_stack()) + # 处理文本:对应位置、匹配颜色、显示数量+占比 geom_text( stat = "count", aes( label = paste0(after_stat(count), "\n(", percent(after_stat(count / sum(count))), ")"), color = sex ), position = position_stack(vjust = 0.5), # 文本放在柱子中间防重叠;要放上方改vjust=-0.1即可 size = 3 ) + # 让文本颜色和柱子填充色完全一致 scale_color_manual(values = hue_pal()(2)) + theme_minimal() + theme( axis.text.x = element_text(angle = 90, hjust = 1), # x轴文本右对齐更美观 # 隐藏Y轴所有元素 axis.text.y = element_blank(), axis.title.y = element_blank(), axis.ticks.y = element_blank(), legend.title = element_text(text = "性别") # 可选:修改图例标题为中文 ) p1
核心调整说明
解决文本重叠+颜色不匹配:
- 给
geom_text的aes参数加上color = sex,让文本颜色与对应性别柱子绑定,再用scale_color_manual复用柱子的调色板,保证颜色完全对应。 - 设置
position = position_stack()与geom_bar的堆叠方式一致,搭配vjust调整文本在柱子内的位置,彻底解决重叠问题。
- 给
显示数量+占比:
- 用
paste0把计数(after_stat(count))和分组占比(count/sum(count))拼接在一起,sum(count)会自动按每个AgeGroup分组计算总人数,得到的就是该组内男女的占比。 - 加入
\n换行,让数量和占比分行显示,可读性更强。
- 用
隐藏Y轴:
- 通过
theme将Y轴的文本、标题、刻度都设为element_blank(),直接实现Y轴为空的效果。
- 通过
备选方案:提前预处理数据(更灵活高效)
如果数据量较大,提前汇总后再绘图效率更高,代码如下:
library(dplyr) library(ggplot2) library(scales) # 按年龄组+性别汇总人数,计算占比 people_summary <- people %>% group_by(AgeGroup, sex) %>% summarise(count = n(), .groups = "drop") %>% group_by(AgeGroup) %>% mutate(percent = percent(count / sum(count))) # 用汇总后的数据绘图 p1 <- ggplot(people_summary, aes(x = AgeGroup, y = count, fill = sex)) + geom_col(position = position_stack()) + geom_text( aes(label = paste0(count, "\n(", percent, ")"), color = sex), position = position_stack(vjust = 0.5), size = 3 ) + scale_color_manual(values = hue_pal()(2)) + theme_minimal() + theme( axis.text.x = element_text(angle = 90, hjust = 1), axis.text.y = element_blank(), axis.title.y = element_blank(), axis.ticks.y = element_blank() ) p1
内容的提问来源于stack exchange,提问作者Usman YousafZai
相关产品推荐
相关产品推荐

