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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:07:17