如何在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
相关产品推荐
相关产品推荐

