gpt4 book ai didi

r - 密度图矩阵,每个图覆盖两个分布

转载 作者:行者123 更新时间:2023-12-05 00:31:28 24 4
gpt4 key购买 nike

我有一个 data.frame有 5 列,我想生成一个密度图矩阵,这样每个密度图都是两个密度图的叠加。 (这类似于 plotmatrix,除了在我的情况下,每列中非 NA 值的数量因列而异,我想要叠加分布而不是散点图)。

我的第一次尝试没有成功,如下所示:

library(ggplot2)
library(reshape)

tmp1 <- data.frame(do.call(cbind, lapply(1:5, function(x) {
r <- rnorm(100)
r[sample(1:100, 20)] <- NA
return(r)
})))

ggplot( melt(tmp1), aes(x=value, fill=variable))+
geom_density(alpha=0.2, position="identity")+opts(legend.position = "none")+
facet_grid(variable ~ variable)

我的第二种方法使我几乎达到了目标,但我只想在所有图中使用两种颜色而不是 5 种不同的颜色。而且,我确信有一种更优雅的方式来构建这个扩展矩阵:
tmp2 <- do.call(rbind, lapply(1:5, function(i) {
do.call(rbind, lapply(1:5, function(j) {
r <- rbind(data.frame(var=sprintf('X%d', i), val=tmp1[,i]),
data.frame(var=sprintf('X%d', j), val=tmp1[,j]))
r <- data.frame(xx=sprintf('X%d', i), yy=sprintf('X%d', j), r)
return(r)
}))
}))
ggplot(tmp2, aes(x=val, fill=var))+
geom_density(alpha=0.2, position="identity")+opts(legend.position = "none")+
facet_grid(xx ~ yy)

我的解决方案是手动遍历成对的列并手动生成叠加的密度图,将它们保存到列表中。然后我使用“grid.arrange”将它们排列在网格中,给出下图。

但是可以使用 facet_grid 来实现这一点吗?反而?

Matrix of overlaid density plots

最佳答案

最简单的方法是使用所有排列(5 * 5 = 25 个)来 reshape 您的数据。

require(gregmisc)
perm <- permutations(5, 2, paste0("X", 1:5), repeats.allowed=TRUE)
# instead of gregmisc + permutations, you can use expand.grid from base as:
# perm <- expand.grid(paste0("X", 1:5), paste0("X", 1:5))
o <- apply(perm, 1, function(idx) {
t <- tmp1[idx]
names(t) <- c("A", "B")
t$id1 <- idx[1]
t$id2 <- idx[2]
t
})
require(ggplot2)
require(reshape2)
o <- do.call(rbind, o)
o.m <- melt(o, c("id1", "id2"))
o.m$id1 <- factor(o.m$id1)
o.m$id2 <- factor(o.m$id2)
p <- ggplot(o.m, aes(x = value))
p <- p + geom_density(alpha = 0.2, position = "identity", aes(fill = variable))
p <- p + theme(legend.position = "none")
p <- p + facet_grid(id1 ~ id2)
p

ggplot2_facet_grid

关于r - 密度图矩阵,每个图覆盖两个分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14798226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com