如何避免因子重复时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
相关产品推荐
相关产品推荐

