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

geom_col()多分组值场景下未按预期求和的问题排查

问题解析:geom_col分组求和结果不符的原因与解决

核心问题

你对geom_col()的自动求和逻辑理解有误:

  • 仅当使用默认的position = "stack"(堆叠模式)时,geom_col()才会自动将同一x分组下的多行数值叠加,呈现总和。
  • 但你设置了position = position_dodge()(并列模式),此时geom_col()不会对同一fill/group分组内的多行数据求和,而是为每一行数据单独绘制柱子。你的数据中2013年有7行、2017年有4行,这些同年份的柱子因x轴均为study="A",会完全重叠,最终显示的是单一行的数值(而非总和)。

验证与解决

验证重叠问题

将position_dodge()替换为position_jitter(),就能看到同一年份的多个小柱子分散显示,直观验证重叠现象:

d %>% 
  ggplot(aes(study, score, group = as.factor(year))) + 
  geom_col(aes(fill = as.factor(year)), position = position_jitter(width=0.2)) +
  scale_y_continuous(limits =  c(0,30))

标准解决方案

要实现并列展示分组求和后的柱子,最可靠的方式是先通过dplyr::summarise()对year和study分组求和,也就是你第二种写法的逻辑:

d %>% 
  group_by(year, study) %>% 
  summarise(score = sum(score), .groups = "drop") %>% 
  ggplot(aes(study, score, fill = as.factor(year))) + 
  geom_col(position = position_dodge()) +
  scale_y_continuous(limits =  c(0,30))

(注:此处可省略group = as.factor(year),因为fill参数已自动生成分组)

替代方案:用stat_summary直接计算求和

若想在绘图环节直接计算总和,可使用stat_summary():

d %>% 
  ggplot(aes(study, score, fill = as.factor(year))) + 
  stat_summary(fun = sum, geom = "col", position = position_dodge()) +
  scale_y_continuous(limits =  c(0,30))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:01:20