You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:10:16