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

如何在R语言中使用ggplot2将两个直方图堆叠在一起?

用ggplot2堆叠两个直方图的解决方案

嘿,我来帮你把这两个数据集的直方图用ggplot2堆叠在一起~首先得把你的数据整理成ggplot喜欢的长格式,然后用geom_histogram实现堆叠效果,同时保留你原来代码里的频率密度(freq=FALSE)和自定义区间的逻辑。

步骤1:整理数据

先把两个独立的数据框合并,添加一个分组列区分uni和end_nodes,这样ggplot才能识别要堆叠的两组数据:

# 保留你原来的roundup函数和数据读取逻辑
roundup <- function(x) { 
  return(as.integer(ceiling(x / 10.0)) * 10) 
}
uni <- read.csv(filepath_1, header = FALSE)
end_nodes <- read.csv(filepath_2, header = FALSE)

# 处理区间的最小值和最大值(和你原来的逻辑一致)
min_end_nodes <- if (min(end_nodes$V1) == 0) 1 else min(end_nodes$V1)
max_end_nodes <- roundup(max(end_nodes$V1))

# 合并数据并添加分组列
library(dplyr)
combined_data <- bind_rows(
  uni %>% mutate(Group = "uni"),
  end_nodes %>% mutate(Group = "end_nodes")
) %>% rename(Value = V1) # 把V1重命名成更直观的名字

步骤2:用ggplot2绘制堆叠直方图

现在用ggplot画图,指定fill=Group区分两组,用position="stack"实现堆叠,设置y=..density..对应你原来的freq=FALSE,并沿用自定义的breaks:

library(ggplot2)

ggplot(combined_data, aes(x = Value, fill = Group)) +
  geom_histogram(
    breaks = seq(min_end_nodes - 1, max_end_nodes, by = 1),
    position = "stack",
    aes(y = ..density..), # 对应hist的freq=FALSE
    alpha = 0.7, # 加一点透明度方便看重叠部分
    color = "black" # 给柱子加边框更清晰
  ) +
  labs(
    title = "堆叠直方图(密度)",
    x = "数值",
    y = "密度",
    fill = "数据集"
  ) +
  theme_minimal() # 用简洁的主题,也可以换成你喜欢的主题

小提示

  • 如果想要百分比堆叠而非密度堆叠,可以把y=..density..换成y=..count../sum(..count..),y轴会变成每组占总数的比例。
  • 调整alpha参数可以改变两组的透明度,方便观察重叠区域。
  • 要是不需要自定义breaks,可去掉该参数,改用binwidth=1指定柱子宽度,效果和你原来的by=1一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:43:13