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

求助:用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()堆叠这些组内占比,得到的是各尺码组内占比的总和,这和你想要的「总优质占比的尺码拆分」完全不是一回事。

修正逻辑说明

修正后的代码核心逻辑是:

  1. 先统计每个尺码下的优质衣物绝对数量(而不是组内占比)
  2. 再计算该数量占所有样本总数的比例——这个比例就是该尺码对总优质占比的贡献
  3. 堆叠这些贡献值,总和正好是品牌整体的优质衣物占比(46.2%),每个分段的高度对应对应尺码的贡献大小

运行后你会看到:

  • 尺码two贡献了4/13≈30.8%
  • 尺码four贡献了2/13≈15.4%
  • 尺码three没有优质衣物,所以没有分段
    两者相加正好是总优质占比46.2%,完全匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 07:37:33