【发布时间】:2013-01-25 17:36:00
【问题描述】:
我有一个有 5 列的data.frame,我想生成一个密度图矩阵,这样每个密度图都是两个密度图的叠加。 (这类似于 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 来实现呢?
【问题讨论】:
标签: r matrix ggplot2 dataframe