2D密度估计图解读:stat_density_2d与geom_density2d_filled的Level差异分析
解读ggplot2中2D密度图的level差异
我用R语言的stat_density_2d()(左图)和geom_density2d_filled()(右图)生成了以下2D密度估计图,两张图视觉上完全一致,但对应的level值差异显著。想请教:
- 如何解读这些数值?比如右图中的黄色区域是否覆盖了最密集区域内25%的观测值,青色区域对应50%?
- 这两种不同level之间的关系是什么?

用到的代码
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
相关产品推荐
相关产品推荐

