基于总样本量创建ggplot2堆叠密度图的实现方法
实现与堆叠柱状图匹配的总样本占比堆叠密度图
我懂你的问题——默认的geom_density(position="stack")是基于组内样本量做密度归一化的,样本量小的组b会被"放大",和你之前做的总样本占比堆叠柱状图逻辑完全不对。要解决这个问题,我们需要把每组的密度值乘以该组在总样本中的占比,让堆叠后的总面积等于1,和柱状图的比例逻辑对齐。
具体步骤和代码
首先给数据框添加每组占总样本的比例列,再用这个比例调整密度值绘图:
library(ggplot2) library(dplyr) # 计算总样本量,给每组添加占总样本的比例 total_samples <- nrow(df) df <- df %>% group_by(group) %>% mutate(group_total_prop = n() / total_samples) %>% ungroup() # 绘制符合需求的堆叠密度图 ggplot(df, aes(x = value, y = ..density.. * group_total_prop, fill = group)) + geom_density(position = "stack", alpha = 0.7) + # alpha参数可选,让重叠区域更清晰 labs( x = "Value", y = "Proportion of Total Samples", title = "Stacked Density Plot (Total Sample Proportion)" ) + theme_minimal()
原理说明
- 默认的
..density..统计量是组内归一化的:每组的密度曲线下面积总和为1,这就是小样本组看起来"偏高"的原因——它的密度是按自身样本量缩放的。 - 用
..density.. * group_total_prop转换后,每组曲线下的面积就等于该组在总样本中的占比(组a是10000/11000,组b是1000/11000),堆叠起来的总面积为1,和你之前的堆叠柱状图比例逻辑完全一致,不会再出现小组被过度展示的问题。
内容的提问来源于stack exchange,提问作者otwtm
相关产品推荐
相关产品推荐

