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

如何在ggplot堆叠条形图中按分组(非整体)显示百分比

解决ggplot堆叠条形图分组内百分比显示问题

当前代码计算的是整体数据的百分比,要实现每个V1分组(TRUE/FALSE)内的百分比,有两种可行方法:

方法一:直接在ggplot中分组计算

修改stat_count里的百分比计算逻辑,按V1分组求和,替换整体求和:

df <- structure(list(V1 = c(TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE), V2 = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)), row.names = c(NA, -50L), class = "data.frame")

ggplot(df) +
  aes(x = V1, fill = V2) +
  geom_bar(position = "stack") +
  stat_count(
    position = "stack",
    aes(label = paste0(round(..count../ave(..count.., ..x.., FUN = sum) * 100), "%")),
    geom = "text", size = 5, vjust = -0.5
  )

核心是用ave(..count.., ..x.., FUN = sum)获取每个V1分组的总数量,这样计算出的百分比就是分组内占比。

方法二:提前预处理数据(更直观)

先用dplyr统计分组计数和百分比,再绘图,逻辑更清晰:

library(dplyr)

# 统计分组计数与百分比
df_summary <- df %>%
  count(V1, V2) %>%
  group_by(V1) %>%
  mutate(percent = paste0(round(n / sum(n) * 100), "%")) %>%
  ungroup()

# 绘图
ggplot(df_summary) +
  aes(x = V1, y = n, fill = V2) +
  geom_col(position = "stack") +
  # 可调整vjust控制文本位置,0.5为居中,-0.5为条形上方
  geom_text(aes(label = percent), position = position_stack(vjust = -0.5), size = 5)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:33:13