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

2D密度估计图解读:stat_density_2d与geom_density2d_filled的Level差异分析

解读ggplot2中2D密度图的level差异

我用R语言的stat_density_2d()(左图)和geom_density2d_filled()(右图)生成了以下2D密度估计图,两张图视觉上完全一致,但对应的level值差异显著。想请教:

  • 如何解读这些数值?比如右图中的黄色区域是否覆盖了最密集区域内25%的观测值,青色区域对应50%?
  • 这两种不同level之间的关系是什么?

2D密度估计对比图

用到的代码

library(ggplot2)

set.seed(123)
dat <-
  data.frame(
    X = c(rnorm(300, 3, 2.5), rnorm(150, 7, 2)),
    Y = c(rnorm(300, 6, 2.5), rnorm(150, 2, 2)))

# 左图:stat_density_2d生成
ggplot(dat, aes(X, Y)) +
  stat_density_2d(geom = "polygon",
                  aes(fill = after_stat(level)), bins = 4) +
  geom_point(alpha = 0.1)

# 右图:geom_density2d_filled(归一化密度)
ggplot(dat, aes(X, Y)) +
  geom_density2d_filled(
    aes(fill = after_stat(level)),
    contour_var = "ndensity",
    breaks = seq(0.25, 1, length.out = 4)
  ) +
  geom_point(alpha = 0.1)

# 补充:用原始密度的geom_density2d_filled
ggplot(dat, aes(X, Y)) +
  geom_density2d_filled(
    aes(fill = after_stat(level)),
    contour_var = "density",
    bins = 4) +
  geom_point(alpha = 0.1)

核心解读

1. 两个函数的level本质差异

  • stat_density_2d()默认用原始密度(density):这里的level是概率密度的绝对值,单位是「概率/单位面积」,数值大小和样本量、数据分布范围直接相关——样本量越大,密度峰值可能越高,它反映的是区域内数据点的密集程度绝对值。
  • geom_density2d_filled()指定contour_var = "ndensity"时用归一化密度:这里的level是把原始密度除以全局最大密度得到的相对值,范围在0-1之间。1对应整个数据集中密度最高的区域,0对应密度最低的区域,只反映密集程度的相对比例,和样本量、绝对分布无关。

2. 关于观测值比例的误区

你提到的「黄色区域覆盖25%观测值」是误解:ndensity的level区间(比如0.75-1)仅代表密度值处于最高25%的相对区间,和该区域内的观测值数量比例没有直接对应关系。如果想生成对应观测值比例的区域,需要改用contour_var = "count",或者通过密度积分计算对应比例的level阈值。

3. 让两个图level匹配的方法

如果想让geom_density2d_filled()的level和stat_density_2d()完全对应,只需将contour_var设置为"density"(即你补充的第三个代码),此时两者都会基于原始密度值生成区间,数值和视觉效果都会对齐。


内容的提问来源于stack exchange,提问作者carl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:17:57