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

R语言ggplot2堆叠百分比柱状图添加准确标签方案咨询

方案1:无需提前数据预处理,直接修改geom_text代码即可

你之前的标签计算逻辑问题出在:..count../sum(..count..)统计的是全数据集的百分比,而非每个成绩分组内的性别占比,同时没有指定分组维度导致计算逻辑匹配不上堆叠柱图的分组规则。

直接替换注释掉的geom_text代码段为以下内容即可正常显示百分比:

geom_text(aes(label = scales::percent(after_stat(prop), accuracy = 1), group = GRDE_CODE), 
          stat = "count", position = position_fill(vjust = 0.5))

如果需要同时展示计数和百分比,修改label参数即可:

geom_text(aes(label = paste0(after_stat(count), "\n", scales::percent(after_stat(prop), accuracy = 1)), 
              group = GRDE_CODE), 
          stat = "count", position = position_fill(vjust = 0.5))

方案2:轻量预处理(更推荐,完全避免标签错位)

仅需少量汇总代码即可实现100%匹配的标签效果,逻辑清晰不易出错:

第一步:数据预处理

library(dplyr)
plot_data <- df.test %>%
  # 保留原过滤逻辑
  filter(!(GRDE_CODE %in% c("IP", "INC", "NG"))) %>%
  filter(Course.lvl %in% c("200-level", "100-level")) %>%
  # 按分面、X轴、填充维度分组计数
  count(Course.lvl, GRDE_CODE, GENDER, name = "cnt") %>%
  # 计算每个分组内的性别占比
  group_by(Course.lvl, GRDE_CODE) %>%
  mutate(pct = cnt / sum(cnt)) %>%
  ungroup()

第二步:绘图代码

ggplot(plot_data, aes(x = GRDE_CODE, fill = GENDER)) +
  # 改用geom_col直接传入汇总好的数值
  geom_col(aes(y = pct), position = "fill") +
  # 直接使用预处理好的计数和百分比
  geom_text(aes(y = pct, label = paste0(cnt, "\n", scales::percent(pct, accuracy = 1))), 
            position = position_fill(vjust = 0.5)) +
  scale_y_continuous(labels = scales::percent) +
  scale_fill_manual(values = c(Female = "#F99A46", 
                               Male = "#0BB021", `Not Reported` = "#3404DD")) +
  labs(x = "Grade Code", y = "% of Grade", title = "Math - 100/200") +
  coord_flip() +
  theme_classic() +
  facet_grid(vars(), vars(Course.lvl))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:27:02