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

R语言绘制双类别堆叠柱状图并添加堆叠百分比标签方法

R ggplot2 百分比堆叠柱状图添加区块百分比标签实现方法

直接在现有绘图代码基础上新增geom_text()文本图层,匹配和柱状图一致的填充位置规则,同时调用ggplot2内置的统计值计算占比即可,不需要提前对数据集做汇总统计。

完整可运行示例代码

library(ggplot2)

# 构造提供的示例数据集
df <- data.frame(
  A = c("ABC","DEF","GHI","XYZ","JKL","ABC","XYZ","XYZ"),
  User = c("Male","Female","Female","Female","Male","Male","Male","Female")
)

ggplot(df, aes(x = User, fill = A)) + 
  geom_bar(position = "fill") + 
  # 新增百分比标签层
  geom_text(
    aes(label = scales::percent(after_stat(count / tapply(count, x, sum)[x]), accuracy = 1)),
    position = position_fill(vjust = 0.5),
    size = 3.5
  ) +
  scale_fill_brewer(palette = "BrBG") + 
  # 同步将y轴刻度调整为百分比格式
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  labs(y = "Percent")

关键参数说明

  • after_stat():用于直接获取geom_bar()图层自动统计生成的变量,这里取每个堆叠块的计数count,按x轴的User分组计算组内总和后相除,得到每个A类别在对应User组的占比
  • scales::percent():将0-1区间的小数占比自动转换为带%符号的百分比文本,accuracy = 1表示百分比取整,不需要小数位
  • position = position_fill(vjust = 0.5):保证文本位置和堆叠柱状图的区块位置完全对齐,vjust = 0.5设置文本在区块内部垂直居中,若需要把文本放在区块上边缘可将参数改为vjust = 1
  • 如果需要显示原始计数而非百分比,直接将label映射改为after_stat(count)即可,其余参数不需要调整。

若使用的是3.3.0以前的旧版本ggplot2,将代码里的after_stat()替换为stat()即可正常运行。

内容的提问来源于stack exchange,提问作者user2845095

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:48:21