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

如何避免因子重复时ggplot2条形图出现堆叠现象?

ggplot2重复因子条形图堆叠问题解决思路

问题场景

当数据中同一因子重复出现时,使用geom_bar()或geom_col()会默认堆叠重复的条形,导致每个因子对应n个重复堆叠的条形(n为重复次数),但需求是保留原始数据结构的同时,每个因子只显示一个对应值的条形。

问题复现代码

library("ggplot2")

mydata <- data.frame(var_one=rep(c("a", "b", "c", "d", "e"), 5), var_two=rep(c(1.5, 2, 2.2, 1.8, 1.2), 5))

# 重复因子堆叠的错误绘图
ggplot(mydata, aes(x=var_one, y=var_two)) +
    geom_col(fill="lightcoral", alpha=.8, width=.4, color="black")

预期效果参考

# 手动去重后的理想绘图(但不能修改原始数据结构)
mydata_mod <- data.frame(var_one=c("a", "b", "c", "d", "e"), var_two=c(1.5, 2, 2.2, 1.8, 1.2))
ggplot(mydata_mod, aes(x=var_one, y=var_two)) +
    geom_col(fill="lightcoral", alpha=.8, width=.4, color="black")

解决方法(无需修改原始数据)

方法1:使用stat_summary做即时聚合

利用stat_summary()在绘图阶段直接对每个因子的var_two取唯一值(因重复值完全一致,用均值、最大值等函数结果也相同),避免堆叠:

ggplot(mydata, aes(x=var_one, y=var_two)) +
  stat_summary(fun = "unique", geom = "col", 
               fill="lightcoral", alpha=.8, width=.4, color="black")

方法2:在ggplot数据参数中即时去重

借助dplyr的distinct()函数在传入数据时临时去重,不改变原始mydata对象:

library(dplyr)
ggplot(distinct(mydata, var_one, .keep_all = TRUE), aes(x=var_one, y=var_two)) +
  geom_col(fill="lightcoral", alpha=.8, width=.4, color="black")

.keep_all = TRUE会保留var_one唯一值对应的所有列数据,适配每个因子对应值一致的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:00:58