4

5 列の がdata.frameあり、各密度プロットが 2 つの密度プロットのオーバーレイになるように、密度プロットのマトリックスを生成したいと考えています。(これは 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)

私の 2 番目のアプローチはほぼそこに到達しましたが、5 つの異なる色の代わりに、すべてのプロットで 2 つの色のみを使用したいと考えています。そして、この展開された行列を構築するためのよりエレガントな方法があると確信しています:

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代わりに使用してこれを達成することは可能ですか?

オーバーレイされた密度プロットの行列

4

1 に答える 1

6

最も簡単な方法は、すべての順列 (5 * 5 = 25 個) を使用してデータを再形成することです。

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

于 2013-02-10T13:56:11.433 に答える