如何在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
相关产品推荐
相关产品推荐

