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

如何在ggplot中绘制分组内占比而非计数的柱状图

解决方法

你可以通过两种常见方式实现需求,最终每个disease分组内的sex占比总和为100%:

方法1:无需提前汇总数据,直接在ggplot层计算组内百分比

直接修改原代码的映射逻辑,利用after_stat()获取柱子统计后的计数,按disease分组计算占比即可,完整代码如下:

library(survival)
library(ggplot2)
library(scales) # 用于格式化百分比轴标签

ggplot(data=kidney, aes(x = disease)) +
  geom_bar(
    aes(fill = as.factor(sex), 
        y = after_stat(count / sum(count))), # 按x轴分组(disease)计算组内占比
    position = "dodge"
  ) +
  scale_y_continuous(labels = percent) + # y轴显示百分比格式
  labs(y = "组内占比", fill = "性别")

原理:geom_bar()默认的统计变换会生成count列,after_stat(count / sum(count))会在每个x轴分组(也就是每个disease类别)内计算当前sex类别的计数占该disease总计数的比例,刚好满足你的需求。

方法2:提前汇总数据后绘图(逻辑更可控)

如果需要自己控制统计逻辑,可以先用dplyr提前算好每个disease分组下不同sex的占比,再用geom_col()绘制:

library(survival)
library(ggplot2)
library(dplyr)
library(scales)

# 先汇总计算占比
pct_df <- kidney %>%
  group_by(disease, sex) %>%
  summarise(n = n(), .groups = "drop_last") %>% # 统计每个disease-sex组合的样本数
  mutate(pct = n / sum(n)) # 按disease分组计算占比

# 绘图
ggplot(pct_df, aes(x = disease, y = pct, fill = as.factor(sex))) +
  geom_col(position = "dodge") +
  scale_y_continuous(labels = percent) +
  labs(y = "组内占比", fill = "性别")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:45:03