如何在R的ggplot2中为堆叠百分比条形图添加标签
按性别分组的百分比堆叠条形图添加标签方案
需求场景
我有一个包含SEXO(取值为M/F)和Class(取值为0/1)变量的数据集,使用ggplot2绘制按性别分组的Class百分比堆叠条形图时,已生成基础图表,但无法在条形内部添加对应百分比标签,仅需显示各SEXO分组内的百分比,无需修改轴标签。现有基础代码:
ggplot(data = df, aes(x = SEXO, fill = Class)) + geom_bar(position = 'fill')
解决方案
以下两种方法均可实现目标:
方法1:直接通过stat_count计算并添加标签
无需预处理数据,利用geom_text结合stat='count'自动计算占比:
library(ggplot2) library(scales) ggplot(data = df, aes(x = SEXO, fill = Class)) + geom_bar(position = 'fill') + # 添加百分比标签,居中显示在堆叠块内 geom_text(stat = 'count', aes(label = percent(after_stat(count)/sum(count))), position = position_fill(vjust = 0.5))
after_stat(count)获取每个SEXO+Class组合的样本数- 除以
sum(count)得到当前SEXO分组内的占比,percent()将数值转为百分比格式 position_fill(vjust=0.5)让标签垂直居中于每个堆叠区域
方法2:先预处理数据计算百分比,再绘图
先通过dplyr统计各分组占比,再绘图:
library(ggplot2) library(dplyr) library(scales) # 预处理数据:计算每个性别分组内Class的占比 df_summary <- df %>% group_by(SEXO, Class) %>% summarise(n = n(), .groups = "drop") %>% group_by(SEXO) %>% mutate(pct = n / sum(n)) # 绘制带标签的堆叠条形图 ggplot(data = df_summary, aes(x = SEXO, y = pct, fill = Class)) + geom_col() + geom_text(aes(label = percent(pct)), position = position_stack(vjust = 0.5))
- 先分组统计每个
SEXO+Class的样本量,再计算同一性别下各Class的占比 geom_col()替代geom_bar()直接使用预处理好的占比数据position_stack(vjust=0.5)实现标签居中
内容的提问来源于stack exchange,提问作者Iñaki Baglivo
相关产品推荐
相关产品推荐

