我在R中分别使用stat_density_2d()
(左)和geom_density2d_filled()
(右)创建了以下图表,尽管这两个图表看起来完全相同,但水平却有很大不同。
如何将这些值置于上下文或进行解释?例如,右图中的黄色区域是否分别覆盖了密度最大区域中25%的观测值,青色区域是否分别覆盖了50%的观测值。这些不同水平之间的关系是什么?
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)))
ggplot(dat, aes(X, Y)) +
stat_density_2d(geom = "polygon",
aes(fill = after_stat(level)), bins = 4) +
geom_point(alpha = 0.1)
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)
# EDIT to incorporate chart based on comment
ggplot(dat, aes(X, Y)) +
geom_density2d_filled(
aes(fill = after_stat(level)),
contour_var = "density",
bins = 4) +
geom_point(alpha = 0.1)
1条答案
按热度按时间rpppsulh1#
虽然之前已经有过关于这个问题的讨论,但我想我会在这里发布一个答案,说明如何确保每个轮廓线中包含特定比例的点。
为此,我们可以使用
MASS::kde2d
获取2d密度,然后使用terra
转换为栅格。然后,我们可以根据相关2d密度格网中的密度对点进行排序,并使用approx
找到通过分位数的密度这意味着,如果我们可以指定一个分位数向量:
我们可以得到一个易于解释的图,显示包含20%、40%、60%和80%的点的区域,如下所示:
四分位数是这样的:
请注意,这与
ndensity
图中的水平非常不同,后者是 * 最大密度的比例 *,而不是包含固定比例点的区域。换句话说,如果您从侧面观察ndensity
图的3-D表示,条带将全部具有相同的高度,如以下动画所示(请参阅脚注了解生成此动画的代码):当存在高密度囊袋时,代码似乎给予了“奇怪”的结果,例如:
我们可以看到第80百分位数包含“岛屿”或非连续区域。然而,这仅仅是因为我们仍在绘制 * 密度 *,这些区域高于包含正确点数的阈值密度值。无论在何处设置阈值,都不能保证密度带是单个连续区域。
我们可以使用
density_quantiles
的quantiles
版本的3D图清楚地看到这一点,其中低密度的小“块”在这里和那里突破了我们的阈值。相反,如果您希望区域是连续的,那么您的问题将变得难以定义。例如,如果您希望区域是连续的,则不清楚下面的密度图应该是什么样子:
在这个例子中,为了得到连续的区域,我们必须选择其中一个聚类作为中心点,从中心点开始计算点的数量,这将给予非常人为和误导性的结果,这些结果根本不能反映密度,而必须是距离最高密度点的距离函数,因此总是一组嵌套的圆,就像靶心一样。
动画代码