geom_histogram子集数据绘图:如何解决柱形重叠问题?
解决直方图并排显示的问题
你的问题出在两次独立调用geom_histogram——ggplot会把这两个图层当成完全独立的元素,不会识别它们是需要并排对比的分组,所以position="dodge"无法生效。正确的做法是先给数据新增一个年份分组变量,再用单个geom_histogram通过映射分组变量来实现并排。
步骤1:预处理数据,新增年份分组
先把Year转换为数值型(避免字符型比较的潜在问题),然后新增Year_Group列区分2014年前后:
# 转换Year为数值型(如果原数据是字符格式) WMGoalsAll$Year <- as.numeric(WMGoalsAll$Year) # 新增分组变量 WMGoalsAll$Year_Group <- ifelse(WMGoalsAll$Year <= 2014, "≤2014", ">2014")
步骤2:重新绘制直方图
用单个geom_histogram,将fill映射到Year_Group,同时设置position="dodge2"确保不同分组的柱形宽度一致:
library(ggplot2) ggplot(WMGoalsAll, aes(x = GoalsMin, fill = Year_Group)) + geom_histogram(binwidth = 0.02, colour = "black", position = position_dodge2(preserve = "single")) + facet_grid(Discipline ~ ., scales = "free") + scale_x_continuous(breaks = seq(0, 0.3, 0.02)) + scale_fill_manual(values = c("≤2014" = "powderblue", ">2014" = "tomato3")) + # 指定自定义颜色 theme_light() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5))
关键说明
- 用数据本身的分组变量映射
fill,ggplot会自动识别需要并排的组,position参数才能正常工作。 position_dodge2(preserve="single")比普通dodge更适合直方图,能保证即使某个分组在区间内没有数据,另一组的柱形宽度也不会被拉伸,对比更准确。- 保留
facet_grid(Discipline ~ ., scales="free"),男女项目的分面对比效果依然清晰。
内容的提问来源于stack exchange,提问作者Eccles
相关产品推荐
相关产品推荐

