将 ggplot2 与 ks 包的 kde 图一起使用
use ggplot2 with kde plots of ks package
我正在使用 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
的包。这样不行。
前两个在 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
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
的包。这样不行。
前两个在 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 创建