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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:03:04