求助:用R语言ggplot2绘制非100%填充的质量占比堆叠条形图
解决堆叠条形图展示总优质占比及尺码贡献的问题
我完全理解你的需求:要展示Armani品牌整体的优质衣物占比(总优质数/总样本数,这里是6/13≈46.2%),同时按尺码拆分这个占比的构成,既不想把各尺码的组内优质占比相加,也不想用position_fill()把条形拉满到100%。
修正后的代码
library(dplyr) library(ggplot2) # 第一步:处理数据,计算每个尺码对总优质占比的贡献 sok_summary <- sok %>% # 按品牌和尺码分组,统计该尺码下的优质衣物数量 group_by(brand, size) %>% summarise(quality_count = sum(type == 1), .groups = "drop") %>% # 计算总样本数,再算出每个尺码贡献的占比(转换为百分比) mutate(total_samples = nrow(sok), contribution = (quality_count / total_samples) * 100) # 第二步:绘制符合需求的堆叠条形图 ggplot(sok_summary, aes(x = brand, y = contribution, fill = size)) + geom_col() + # 可选:给每个分段添加占比标签,让结果更直观 geom_text(aes(label = sprintf("%.1f%%", contribution)), position = position_stack(vjust = 0.5)) + labs(title = "Armani优质衣物总占比及尺码贡献", y = "占总样本的比例(%)", fill = "尺码")
为什么你的原始代码不符合需求?
你之前的代码里,quality = as.numeric(mean(type) * 100)计算的是每个尺码组内部的优质衣物占比(比如尺码four的组里有3个样本,其中2个是优质,所以占比约66.7%)。用geom_col()堆叠这些组内占比,得到的是各尺码组内占比的总和,这和你想要的「总优质占比的尺码拆分」完全不是一回事。
修正逻辑说明
修正后的代码核心逻辑是:
- 先统计每个尺码下的优质衣物绝对数量(而不是组内占比)
- 再计算该数量占所有样本总数的比例——这个比例就是该尺码对总优质占比的贡献
- 堆叠这些贡献值,总和正好是品牌整体的优质衣物占比(46.2%),每个分段的高度对应对应尺码的贡献大小
运行后你会看到:
- 尺码two贡献了4/13≈30.8%
- 尺码four贡献了2/13≈15.4%
- 尺码three没有优质衣物,所以没有分段
两者相加正好是总优质占比46.2%,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者mightaskalot
相关产品推荐
相关产品推荐

