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

如何在ggplot2中基于原始数据为堆叠条形图添加百分比标签

给堆叠条形图添加百分比标签的解决方案

我来帮你搞定这个问题~你目前的代码已经生成了按比例填充的堆叠条形图,要添加每个堆叠块的百分比标签,只需要额外加上geom_text层就行,这里有两种简单的实现方式:

方法一:直接在ggplot中通过统计变换计算百分比

这种方法不需要提前处理数据,直接利用ggplot的统计功能计算每个分组的占比:

ggplot(na.omit(cat.risk.domain), aes(COLE_CATEGORIA, fill=risklevel)) +
  geom_bar(position = 'fill', colour="white") +
  scale_y_continuous(labels = scales::percent) +
  # 添加百分比标签
  geom_text(stat = "count", 
            # 计算每个risklevel在对应COLE_CATEGORIA组内的百分比并格式化
            aes(label = scales::percent(after_stat(count)/sum(after_stat(count)), accuracy = 1)),
            # 让标签在每个堆叠块的垂直居中位置
            position = position_fill(vjust = 0.5),
            size = 3) # 可根据需求调整标签大小

这里的after_stat(count)会获取每个子分组的计数,sum(after_stat(count))则是对应COLE_CATEGORIA分组的总计数,两者相除得到占比;accuracy=1表示百分比保留整数,你可以改成0.1来保留一位小数。

方法二:先预处理数据计算百分比,再绘图

如果你需要更灵活地控制数据(比如后续还要做其他分析),可以先用dplyr提前计算好每个分组的占比:

library(dplyr)

# 预处理数据:统计每个分类下各风险等级的数量和占比
cat.risk.summary <- na.omit(cat.risk.domain) %>%
  group_by(COLE_CATEGORIA, risklevel) %>%
  summarise(n = n(), .groups = "drop") %>% # 统计子组数量
  group_by(COLE_CATEGORIA) %>%
  mutate(pct = n / sum(n)) # 计算组内百分比

# 基于预处理后的数据绘图
ggplot(cat.risk.summary, aes(COLE_CATEGORIA, y = pct, fill = risklevel)) +
  geom_col(colour = "white") + # 用geom_col代替geom_bar,因为已经有y值
  scale_y_continuous(labels = scales::percent) +
  geom_text(aes(label = scales::percent(pct, accuracy = 1)),
            position = position_stack(vjust = 0.5),
            size = 3)

小提示

  • 如果遇到标签重叠的情况,可以在geom_text里加上check_overlap=TRUE,自动隐藏重叠的标签;
  • 调整size参数可以改变标签的字体大小,适配你的图表尺寸。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:16:47