1

42x42マトリックスを28の個別のヒートマップとして視覚化したいのですが、各ヒートマップは6x6マトリックスであり、値は色の上にプロットされています。マトリックスの下半分だけが必要です。除外されたものは何もプロットしたくありません。次の例のように、後続の6x6マトリックスはオーバーラップしないようにする必要があります。

d = as.matrix(read.table("http://dl.dropbox.com/u/2505196/matrix_posthoc_tukey.dat"))
d[upper.tri(d)] <- NA
d1 <- d[1:6, 1:6]
d2 <- d[1:6, 7:12]
d3 <- d[1:6, 13:18]
d4 <- d[1:6, 18:24]
#...etc, up to d28 <- d[37:42,37:42] 

単一のヒートマップを作成するために使用したコードは次のようになります。

#baseline to create a separated space for all 28 plots
par(mfrow=c(4,7), mar=c(2,2,4,1), oma=c(2,4,2,2))

#using `image` to create heatmap, with color breaks defined by specific values
#the code below create just single heatmap
image(x=1:6, y=1:6, axes = FALSE, ylab="", xlab="", d1, 
  breaks=c(min(d1,na.rm=TRUE), -5.45, -4.65, 4.65, 5.45, max(d1,na.rm=TRUE)),
  col=c("red","orange","white","orange","red"))
axis(2, 1:6, cex.axis = 0.7, las=1, tick=F)
axis(3, 1:6, cex.axis = 0.7, tick=F)
#create vertical and forizontal lines
abline(h=seq(0.5,6.5,1), v=seq(0.5,6.5,1))
#plot values from the specific matrix subset
for (i in 1:6)
   {
     for (j in 1:6)
       {
         txt <- sprintf("%0.1f", d1[i,j])
         text(i, j, txt, cex=0.7)
        }
   }

このような3つのヒートマップは次のようになります。

ここに画像の説明を入力してください

それは私が立ち往生しているところです。d単一ページの複数のヒートマップコレクションに別の画像を追加するたびに、手動で値を変更する必要があります。上記のコードを使用して、マトリックスの特定のサブセットを同時にプロットするための優れたループを作成する方法がわかりません。

ggplot2、latticeを使用した代替ソリューションも歓迎されますが、ここでの主な質問は、この一連のヒートマップを作成するための適切なループであると思います。

4

3 に答える 3

3

これは非常に複雑なプロットですが、Rの標準グラフィックライブラリで簡単に作成できます。多かれ少なかれ、どのインデックスがどのパネルに入るかを追跡するだけです。d1to行列を抽出する方法はd28自動化できるため、すべての行を書き出す必要はありません。

# Get the submatrices
I <- unlist(lapply(0:6, function(a) a:6))
J <- rep(0:6, 7:1)
d2 <- mapply(function(i,j) d[1:6+6*i, 1:6+6*j], I, J, SIMPLIFY=FALSE)

# Setup the layout and add an outer margin for the title and axis labels
layout(matrix(c(1:28, 0, 0), 5, 6))
par(oma=c(3,3,3,1), mar=c(2,2,1,1))

# Plot all the matrices oriented the same way they appear in text
# i.e. the first (vertical) dimension is plotted along the Y-axis
for(k in 1:length(d2)){
    x <- 1:6+6*J[k]
    y <- 1:6+6*I[k]

    # Heatmap & grid
    image(x, y, t(d2[[k]][nrow(d2[[k]]):1,]), las=1, axes=FALSE,
          breaks=c(-1e10, -5.45, -4.65, 4.65, 5.45, 1e10),
          col=c("red","orange","white","orange","red"))
    xg <- apply(!is.na(d2[[k]]), 2, sum)
    yg <- rev(apply(!is.na(d2[[k]]), 1, sum))
    segments(c(x[1]-1, x)+.5, min(y)-.5,
             c(x[1]-1, x)+.5, min(y)+c(6, yg)-.5, xpd=TRUE)
    segments(min(x)-.5,         c(y[1]-1, y)+.5,
             min(x)+c(6,xg)-.5, c(y[1]-1, y)+.5, xpd=TRUE)

    # X & Y-axis values
    mtext(x, 1, .1, at=x, cex=.5)
    mtext(rev(y), 2, .2, at=y, las=1, cex=.5)

    # Values of each cell
    text(rep(x, each=6), rep(rev(y), 6),
     sub("NA", "", sprintf("%.2f", d2[[k]])), cex=.3)
}

# Add title and axis labels
title("All 28 submatrices", outer=TRUE)
mtext("Columns", outer=TRUE, 1, 1)
mtext("Rows", outer=TRUE, 2, 1)

各セルの数字は小さいかもしれませんが、PDFにプロットしてズームインすると、それらを読み取ることができます。関数のxpdパラメーターは、segmentsR​​が線をプロット領域にクリップするのを抑制します(そうしないと、外側の線がわずかに細く表示されます)。

ここに画像の説明を入力してください

于 2012-10-29T08:29:03.150 に答える
1

元のマトリックスの6x6サブ配列を作成するには、次のように動作します。

for (i in seq(1, 42, 6))
    for (j in seq(i, 42, 6)) {
        dsub = d[i:(i+5), j:(j+5)]
        ...
    }

ただし、ヒートマップを再発明するのではなく、より良い方法でヒートマップを作成することをお勧めします。通常のヒートマップを作成するための私のお気に入りのパッケージ(セル内に数字を入れて必要な場合)はpheatmap(=かなりのヒートマップ)ですが、同じページで複数の小さなヒートマップをサポートしていません。これは出力の一例にすぎません。パッケージをインストールしてロードした後にpheatmap()実行すると、関数のヘルプが表示される場合があります。?pheatmap

ここに画像の説明を入力してください

同じページに複数のヒートマップを含めるには、ggplot2パッケージを使用できます。これは、ggplot2ヒートマップを作成する方法と、同じページに複数のプロットを配置する方法優れたマニュアルです。

于 2012-10-27T00:19:07.607 に答える
0

ネストされたループが必要なだけで、d#は配列である必要があると思います(サブマトリックスのサブと呼びます)。私は本当にRを知らないので、私のコードをすみませんが、このようなものです:

for (row in 1:7)
  {
    for (col in 1:7)
      {
        subs[((row-1)*6)+j] <- d[ ((row-1)*6) + 1) : (row*6), (((col-1)*6) + 1) : (col*6)] 
      }
  }

これにより、49個の部分行列すべてが得られます。サブマトリックスの最初の4列のみが必要な場合は、ループ内でcolの範囲を1:4から指定できます。

于 2012-10-26T20:33:28.173 に答える