【问题标题】:use ggplot2 with kde plots of ks package将 ggplot2 与 ks 包的 kde 图一起使用
【发布时间】:2021-12-24 04:48:51
【问题描述】:

我正在使用ks package 来计算和绘制双变量核密度估计。它工作得很好,但我想使用 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)

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

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

【问题讨论】:

  • ggplot2 将创建前两个,但 3D 将是一个艰难的。
  • @RomanLuštrik,没问题。我实际上不需要第三个。

标签: r ggplot2 kernel-density


【解决方案1】:

前两个在 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)

d + geom_density2d_filled()


编辑

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

set.seed(1)

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

library(ggplot2)

等高线图

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()

填充等高线图

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")

光栅图像

ggplot(reshape2::melt(kd$estimate)) +
  geom_raster(aes(x = Var1, y = Var2, fill = value)) +
  scale_fill_viridis_c() +
  coord_equal() +
  theme_classic() +
  theme(legend.position = "none")

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

【讨论】:

  • 我必须使用来自 ks 包的 kde 估计值。 AFAIK,ggplot2 使用一些名为 MASS 的包。
  • @klaus 你对来自 MASS 包的二维估计是正确的。请参阅我的更新以了解如何改用 ks::kde 的输出。
  • 等高线图与我正在使用的数据集的输出不同。 (二元法线只是一个例子。)但是光栅图正在工作,我知道它应该如何工作。谢谢。
猜你喜欢
  • 2014-04-26
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-01
相关资源
最近更新 更多