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

如何使用GGPlot的geom_col()按各国奖牌类型占总奖牌数比例填充柱状图

问题根源

你当前代码的错误来自y轴的映射配置:你将y绑定了总奖牌数Medal_sum,而金/银/铜三个分类下的Medal_sum值完全相同,geom_col()默认堆叠时就会出现三等分的错误效果。你之前尝试将占比映射给fill参数出现渐变,是因为fill绑定了数值型变量,ggplot默认会为数值变量生成连续渐变填充,而fill参数本来应该绑定「奖牌类型」这个分类变量来区分颜色,占比只需要通过柱子段的高度体现即可。

解决方案

方案1:柱子高度为总奖牌数,填充段对应各奖牌实际数量(推荐)

直接将y轴映射改为单个奖牌类型对应的数量字段即可,长表转换后该字段默认名为value,可对照你的数据集字段名调整:

Olympic_overall_tograph %>%
  filter(Medal_sum>60) %>%
  mutate(Country_name = factor(Country, levels=c("Russia", "United States", "Australia", "Germany", "China", "Netherlands", "Cuba", "Brazil"))) %>%
  ggplot(aes(x=Country_name, y=value, fill = variable)) + 
  labs(title = "Winningest Countries in the World", x = "Country", y = "Total Medal Count") +
  geom_col()

生成的柱子高度等于该国总奖牌数,每个填充段的高度对应金/银/铜各自的数量,占总高度的比例就是该类奖牌占总奖牌的比例。

方案2:100%堆积柱状图(所有柱子等高,纯展示占比)

如果不需要体现总奖牌数的差异,只需要对比各国奖牌结构占比,可以用position="fill"参数,所有柱子高度统一为1,对应100%占比:

Olympic_overall_tograph %>%
  filter(Medal_sum>60) %>%
  mutate(Country_name = factor(Country, levels=c("Russia", "United States", "Australia", "Germany", "China", "Netherlands", "Cuba", "Brazil"))) %>%
  ggplot(aes(x=Country_name, y=value, fill = variable)) +
  labs(title = "Winningest Countries in the World", x = "Country", y = "Medal Proportion") +
  geom_col(position = "fill") +
  scale_y_continuous(labels = scales::percent)

你当前生成的效果图表:
当前错误图表
你的数据集结构参考:
数据集结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:36:03