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

基于总样本量创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:57:38