将 ggplot2 与 ks 包的 kde 图结合使用

kla*_*aus 0 r ggplot2 kernel-density

我正在使用ks来计算和绘制二元核密度估计。它效果很好,但我想使用 ggplot 来绘制估计值。

我可以尝试创建一个自定义函数来为 ggplot 准备数据框和其他内容,但我感觉更有经验的 R 用户可以更轻松地做到这一点。

那么,我该怎么做呢?

以下是 ks::kde 的示例场景:

data <- cbind(rnorm(100), rnorm(100))
kd <- ks::kde(data)
plot(kd, display = "slice", col = viridis::viridis(20))
plot(kd, display = "image", col = viridis::viridis(20))
plot(kd, display = "persp", col.fun = viridis::viridis)
Run Code Online (Sandbox Code Playgroud)

上面的代码应该给你以下的图。如何使用 ggplot 来绘制这些图?

编辑:我需要使用ks按包计算的估计值。提供的本机函数ggplot2使用名为 的包MASS。所以这样不行。

切片图 图像图 透视图

All*_*ron 5

前两个在 ggplot 中很简单。这是一个完全可重现的示例:

library(ggplot2)

data <- cbind(rnorm(100), rnorm(100))

d <- ggplot(as.data.frame(data), aes(V1, V2)) + 
  scale_color_viridis_c() +
  theme_bw()

d + geom_density2d(aes(colour = after_stat(level)), bins = 5)
Run Code Online (Sandbox Code Playgroud)

d + geom_density2d_filled()
Run Code Online (Sandbox Code Playgroud)


编辑

要专门使用 的输出ks::kde(),我们需要使用 将其数据从矩阵转换为长格式reshape2::melt,但在 ggplot 中绘制仍然很容易:

set.seed(1)

data <- cbind(rnorm(100), rnorm(100))
kd   <- ks::kde(data)

library(ggplot2)
Run Code Online (Sandbox Code Playgroud)

等高线图

ggplot(reshape2::melt(kd$estimate)) +
  geom_contour(aes(x = Var1, y = Var2, z = value, color = stat(level)),
               bins = 5) +
  scale_color_viridis_c() +
  coord_equal() +
  theme_classic()
Run Code Online (Sandbox Code Playgroud)

填充等值线图

ggplot(reshape2::melt(kd$estimate)) +
  geom_contour(aes(x = Var1, y = Var2, z = value, color = stat(level)),
               bins = 5) +
  scale_color_viridis_c() +
  coord_equal() +
  theme_classic()
Run Code Online (Sandbox Code Playgroud)

光栅图像

ggplot(reshape2::melt(kd$estimate)) +
  geom_contour_filled(aes(x = Var1, y = Var2, z = value, fill = stat(level)),
               bins = 9) +
  scale_fill_viridis_d() +
  coord_equal() +
  theme_classic() +
  theme(legend.position = "none")
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2021 年 11 月 12 日创建(v2.0.0)