如何用R绘制堆叠累积直方图/面积图?
实现按V1分组的堆叠累积面积图
嘿,我来帮你搞定这个需求!你想要的是按V1分组堆叠、以V2为横轴的累积面积图,原代码没法正确堆叠的原因是直接在geom_histogram里用了全局累积计数,没办法区分分组的堆叠逻辑。咱们换个思路,先预处理数据再绘图,就能达到你想要的效果:
第一步:预处理数据,计算分组累积比例
首先得把V2分箱,然后统计每个V1分组在每个分箱里的数量,再算出每个分组的累积比例——这是实现堆叠的关键:
library(data.table) library(ggplot2) # 先重现你的数据 set.seed(1) data <- data.table( V1 = sample(1:6, 1000, replace = T), V2 = rnorm(1000, mean = 5) ) # 给V2分箱,和你原代码的bins=50对应 data[, V2_bin := cut(V2, breaks = 50)] # 统计每个分箱+V1组合的计数 summary_data <- data[, .(count = .N), by = .(V2_bin, V1)] # 把分箱转换成数值(取区间中点),方便绘图时横轴连续 summary_data[, V2_mid := as.numeric(sub("\\((.*),.*\\]", "\\1", V2_bin))] # 按V2排序,计算每个V1分组的累积计数,再转成占总样本的比例 summary_data <- summary_data[order(V2_mid, V1)] summary_data[, cum_count := cumsum(count), by = V1] summary_data[, cum_prop := cum_count / nrow(data)]
第二步:绘制堆叠累积面积图
现在用geom_area来绘制堆叠的累积面积,默认就是堆叠模式,直接用就行:
ggplot(summary_data, aes(x = V2_mid, y = cum_prop, fill = as.factor(V1))) + geom_area(position = "stack", alpha = 0.7) + labs(x = "V2", y = "累积比例", fill = "V1分组") + theme_minimal()
为什么原代码没效果?
你原代码里的y=cumsum(..count..)/sum(..counts..)计算的是全局的累积比例,不是每个分组的累积后再堆叠。geom_histogram的堆叠是针对单个分箱内的计数,但你这里的y是跨分箱的累积值,所以没法正确堆叠分组数据。而先预处理出每个分组的累积比例,再用geom_area就能完美实现你想要的堆叠累积效果啦。
如果想要更贴近直方图的“阶梯”感,也可以把geom_area换成geom_step(position = "stack"),调整一下参数就能实现类似的视觉效果。
内容的提问来源于stack exchange,提问作者lmz
相关产品推荐
相关产品推荐

