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

