29

R でヒートマップを作成することは、多くの投稿、議論、反復のトピックでした。私の主な問題は、latticelevelplot()または basic graphicsで利用可能なソリューションの視覚的な柔軟性と、basic 、pheatmap、または gplotsimage()の簡単なクラスタリングを組み合わせるのが難しいことです。変更したいのは小さな詳細です-x軸のラベルの対角方向。コードのポイントをお見せしましょう。heatmap()pheatmap()heatmap.2()

#example data
d <- matrix(rnorm(25), 5, 5)
colnames(d) = paste("bip", 1:5, sep = "")
rownames(d) = paste("blob", 1:5, sep = "")

次を使用して、向きを斜めに簡単に変更できますlevelplot()

require(lattice)
levelplot(d, scale=list(x=list(rot=45)))

ここに画像の説明を入力

しかし、クラスタリングを適用するのは苦痛に思えます。ヒートマップ セルの周囲に境界線を追加するなど、他の視覚的オプションも同様です。

heatmap()現在、実際の関連機能、クラスタリング、およびすべての基本的なビジュアルに移行するのは非常に簡単です。調整はほとんど必要ありません。

heatmap(d)

ここに画像の説明を入力

そしてここにあります:

require(gplots)
heatmap.2(d, key=F)

ここに画像の説明を入力

そして最後に、私のお気に入りのもの:

require(pheatmap)
pheatmap(d) 

ここに画像の説明を入力

しかし、それらのすべてには、ラベルを回転させるオプションがありません。Manual forは、ラベルの向きをカスタマイズするためにpheatmap使用できることを示唆しています。grid.text特に表示されるラベルのクラスタリングと順序の変更は、なんと楽しいことでしょう。ここで何かが欠けていない限り...

最後に、古き良きものがありimage()ます。ラベルを回転させることができます。一般に、これは最もカスタマイズ可能なソリューションですが、クラスタリング オプションはありません。

image(1:nrow(d),1:ncol(d), d, axes=F, ylab="", xlab="")
text(1:ncol(d), 0, srt = 45, labels = rownames(d), xpd = TRUE)
axis(1, label=F)
axis(2, 1:nrow(d), colnames(d), las=1)

ここに画像の説明を入力

では、クラスタリングとオリエンテーション、および優れた視覚的機能のハッキングを使用して、理想的で迅速なヒートマップを取得するにはどうすればよいでしょうか? これらの 2 つは調整において最も用途が広いように思われるため、私の最良の入札額は変更heatmap()または何らかの形です。pheatmap()しかし、どんな解決策も歓迎します。

4

6 に答える 6

20

を修正するpheatmapには、 へpheatmap:::draw_colnamesの呼び出しでいくつかの設定を調整するだけgrid.text()です。を使用して、これを行う 1 つの方法を次に示しassignInNamespace()ます。(追加の調整が必要になる場合がありますが、画像は取得できます ;):

library(grid)     ## Need to attach (and not just load) grid package
library(pheatmap)

## Your data
d <- matrix(rnorm(25), 5, 5)
colnames(d) = paste("bip", 1:5, sep = "")
rownames(d) = paste("blob", 1:5, sep = "")

## Edit body of pheatmap:::draw_colnames, customizing it to your liking
draw_colnames_45 <- function (coln, ...) {
    m = length(coln)
    x = (1:m)/m - 1/2/m
    grid.text(coln, x = x, y = unit(0.96, "npc"), vjust = .5, 
        hjust = 1, rot = 45, gp = gpar(...)) ## Was 'hjust=0' and 'rot=270'
}

## For pheatmap_1.0.8 and later:
draw_colnames_45 <- function (coln, gaps, ...) {
    coord = pheatmap:::find_coordinates(length(coln), gaps)
    x = coord$coord - 0.5 * coord$size
    res = textGrob(coln, x = x, y = unit(1, "npc") - unit(3,"bigpts"), vjust = 0.5, hjust = 1, rot = 45, gp = gpar(...))
    return(res)}

## 'Overwrite' default draw_colnames with your own version 
assignInNamespace(x="draw_colnames", value="draw_colnames_45",
ns=asNamespace("pheatmap"))

## Try it out
pheatmap(d)

ここに画像の説明を入力

于 2013-03-19T17:41:21.737 に答える
8

heatmapデンドログラムを描画するためにプロット領域を分割し、最後のプロット領域はimageラベルを付けたいプロットではないため、私のコメントが推定するよりも少し複雑です。

ただし、が描画されるときに評価される式を取る引数をheatmap提供するように解決策があります。また、樹状図の順序によって行われるラベルの並べ替えについても知っておく必要があります。最後のビットには、最初にヒートマップを描画して並べ替え情報を取得し、それを使用して角度付きラベルでヒートマップを適切に描画するため、少し洗練されていないハックが含まれます。add.exprimage

最初の例から?heatmap

 x  <- as.matrix(mtcars)
 rc <- rainbow(nrow(x), start = 0, end = .3)
 cc <- rainbow(ncol(x), start = 0, end = .3)
 hv <- heatmap(x, col = cm.colors(256), scale = "column",
               RowSideColors = rc, ColSideColors = cc, margins = c(5,10),
               xlab = "specification variables", ylab =  "Car Models",
               main = "heatmap(<Mtcars data>, ..., scale = \"column\")")

この段階では、ラベルは私たちが望むものではありませんが、そのコンポーネントでのhv順序を変更するために必要な情報が含まれています:colnamesmtcars$colInd

> hv$colInd
 [1]  2  9  8 11  6  5 10  7  1  4  3

orderこれは、たとえば次の出力と同じように使用します。

> colnames(mtcars)[hv$colInd]
 [1] "cyl"  "am"   "vs"   "carb" "wt"   "drat" "gear" "qsec" "mpg"  "hp"  
[11] "disp"

これを使用して、必要なラベルを正しい順序で生成します。

 labs <- colnames(mtcars)[hv$colInd]

次に再度呼び出しますheatmapが、今回labCol = ""は列変数のラベル付けを抑制するように指定します (長さゼロの文字列を使用)。また、 の呼び出しを使用してtext、希望の角度でラベルを描画します。への呼び出しtextは次のとおりです。

text(x = seq_along(labs), y = -0.2, srt = 45, labels = labs, xpd = TRUE)

これは本質的にあなたの質問にあるものです。ラベルがプロットyと重ならないように、これを文字列の長さに合わせて調整する必要があるため、 の値で遊んでください。必要な順序で描画するラベルを渡すようにimage指定します。labels = labs呼び出し全体textが unquoted に渡されadd.exprます。呼び出し全体は次のとおりです。

 hv <- heatmap(x, col = cm.colors(256), scale = "column",
               RowSideColors = rc, ColSideColors = cc, margins = c(5,10),
               xlab = "specification variables", ylab =  "Car Models",
               labCol = "",
               main = "heatmap(<Mtcars data>, ..., scale = \"column\")",
               add.expr = text(x = seq_along(labs), y = -0.2, srt = 45,
                               labels = labs, xpd = TRUE))

結果は次のとおりです。

ここに画像の説明を入力

于 2013-03-19T17:20:26.557 に答える
5

lattice::levelplotおよびを使用したソリューションlatticeExtra::dendrogramGrob

library(lattice)
library(latticeExtra)

サンプルデータ:

d <- matrix(rnorm(25), 5, 5)
colnames(d) = paste("bip", 1:5, sep = "")
rownames(d) = paste("blob", 1:5, sep = "")

行と列の樹状図を定義する必要があります(で内部的に計算されますheatmap)。

dd.row <- as.dendrogram(hclust(dist(d)))
row.ord <- order.dendrogram(dd.row)

dd.col <- as.dendrogram(hclust(dist(t(d))))
col.ord <- order.dendrogram(dd.col)

そして、それらを。の引数のdendrogramGrob関数に渡します。legendlevelplot

からの色で新しいテーマを定義しRColorBrewer、セルの幅と色を変更しましborderborder.lwd

myTheme <- custom.theme(region=brewer.pal(n=11, 'RdBu'))

levelplot(d[row.ord, col.ord],
          aspect = "fill", xlab='', ylab='',
          scales = list(x = list(rot = 45)),
          colorkey = list(space = "bottom"),
          par.settings=myTheme,
          border='black', border.lwd=.6,
          legend =
          list(right =
               list(fun = dendrogramGrob,
                    args =
                    list(x = dd.col, ord = col.ord,
                         side = "right",
                         size = 10)),
               top =
               list(fun = dendrogramGrob,
                    args =
                    list(x = dd.row,
                         side = "top"))))

樹状図によるレベルプロット

引数を使用してshrink、セルのサイズをその値に比例してスケーリングすることもできます。

levelplot(d[row.ord, col.ord],
          aspect = "fill", xlab='', ylab='',
          scales = list(x = list(rot = 45)),
          colorkey = list(space = "bottom"),
          par.settings=myTheme,
          border='black', border.lwd=.6,
          shrink=c(.75, .95),
          legend =
          list(right =
               list(fun = dendrogramGrob,
                    args =
                    list(x = dd.col, ord = col.ord,
                         side = "right",
                         size = 10)),
               top =
               list(fun = dendrogramGrob,
                    args =
                    list(x = dd.row,
                         side = "top"))))

樹状図とスケーリングされたセルサイズを使用したレベルプロット

于 2013-03-20T22:22:42.773 に答える