2017-05-05 35 views
4

Rplotlyという樹状図を持つクラスタヒートマップを作成する方法については、this exampleに従っています。Rのプロットを使って樹状図を使ってクラスタ化されたヒートマップをプロットする

library(ggplot2) 
library(ggdendro) 
library(plotly) 

#dendogram data 
x <- as.matrix(scale(mtcars)) 
dd.col <- as.dendrogram(hclust(dist(x))) 
dd.row <- as.dendrogram(hclust(dist(t(x)))) 
dx <- dendro_data(dd.row) 
dy <- dendro_data(dd.col) 

# helper function for creating dendograms 
ggdend <- function(df) { 
    ggplot() + 
    geom_segment(data = df, aes(x=x, y=y, xend=xend, yend=yend)) + 
    labs(x = "", y = "") + theme_minimal() + 
    theme(axis.text = element_blank(), axis.ticks = element_blank(), 
      panel.grid = element_blank()) 
} 

# x/y dendograms 
px <- ggdend(dx$segments) 
py <- ggdend(dy$segments) + coord_flip() 

# heatmap 
col.ord <- order.dendrogram(dd.col) 
row.ord <- order.dendrogram(dd.row) 
xx <- scale(mtcars)[col.ord, row.ord] 
xx_names <- attr(xx, "dimnames") 
df <- as.data.frame(xx) 
colnames(df) <- xx_names[[2]] 
df$car <- xx_names[[1]] 
df$car <- with(df, factor(car, levels=car, ordered=TRUE)) 
mdf <- reshape2::melt(df, id.vars="car") 
p <- ggplot(mdf, aes(x = variable, y = car)) + geom_tile(aes(fill = value)) 

mat <- matrix(unlist(dplyr::select(df,-car)),nrow=nrow(df)) 
colnames(mat) <- colnames(df)[1:ncol(df)-1] 
rownames(mat) <- rownames(df) 

# hide axis ticks and grid lines 
eaxis <- list(
    showticklabels = FALSE, 
    showgrid = FALSE, 
    zeroline = FALSE 
) 

p_empty <- plot_ly(filename="r-docs/dendrogram") %>% 
    # note that margin applies to entire plot, so we can 
    # add it here to make tick labels more readable 
    layout(margin = list(l = 200), 
     xaxis = eaxis, 
     yaxis = eaxis) 

subplot(px, p_empty, p, py, nrows = 2, margin = 0.01) 

できます:ここでは例です、私は少しそれが私の本当の上で高速に実行するので、私の場合にヒートマップがplotlyはなくggplotで生成されるようにコードを変更し

enter image description here

ビッグデータ、それゆえ私は:

heatmap.plotly <- plot_ly() %>% add_heatmap(z=~mat,x=factor(colnames(mat),lev=colnames(mat)),y=factor(rownames(mat),lev=rownames(mat))) 

そして:

与え210
subplot(px, p_empty, heatmap.plotly, py, nrows = 2, margin = 0.01) 

enter image description here

を私の質問は以下のとおりです。私は、彼らは両方のプロットにそうであるようにヒートマップの行と列のラベルが切断されませもらうにはどうすればよい

  1. 2番目の図では、colorerのラベルが「mat」に変更されています。どのようにそれを防止するための任意のアイデア?

  2. ヒートマップとデンドログラムのマージンを変更するにはどうすればよいですか?

答えて

0

は、どのように私は、彼らは両方のプロットにそうであるようにオフ>カット得ることはありませヒートマップの行と列のラベルを得るのですか?

プロットがcolorerのラベルが2番目の図では「マット」に変更され

sply <- subplot(px, p_empty, heatmap.plotly, py, nrows = 2) 
sply <- layout(sply, 
       margin = list(l = 150, 
          r = 0, 
          b = 50, 
          t = 0 
          ) 
       ) 

を発生させた後margin秒を設定してみてください。任意の アイデアを防ぐ方法は?

これを防ぐ方法はありませんが、ラベルを上書きすることはできます。私はヒートマップと系統樹間の余白を変更するにはどうすればよい

sply$x$data[[3]]$colorbar$title <- 'mat' 

各サブプロットの軸ごとにdomainを指定できます。 yaxisは、左上隅のプロットに対応し、yaxis2は、そのすぐ隣のプロットに対応します。

距離を大きくするほど効果が上がります。plotlyで完全に動作するクラスタのヒートマップを作成

sply <- layout(sply, 
       yaxis = list(domain=c(0.47, 1)), 
       xaxis = list(domain=c(0, 0.5)), 
       xaxis3 = list(domain=c(0, 0.5)), 
       xaxis4 = list(domain=c(0.5, 1)), 
       ) 

enter image description here

pl <- subplot(px, p_empty, p, py, nrows = 2) 
heatmap.plotly <- plot_ly() %>% add_heatmap(z=~mat,x=factor(colnames(mat),lev=colnames(mat)),y=factor(rownames(mat),lev=rownames(mat))) 
sply <- subplot(px, p_empty, heatmap.plotly, py, nrows = 2) 
sply$x$data[[3]]$colorbar$title <- 'mat' 
sply <- layout(sply, 
       yaxis = list(domain=c(0.47, 1)), 
       xaxis = list(domain=c(0, 0.5)), 
       xaxis3 = list(domain=c(0, 0.5)), 
       xaxis4 = list(domain=c(0.5, 1)), 
       margin = list(l = 150, 
          r = 0, 
          b = 50, 
          t = 0 
          ) 


       ) 

sply 
+0

私はplotyオブジェクトのフィールドに直接アクセスするのではなく、インタフェースが多少変更されやすいので、 'colorbar(sply、title =" mat ")'を使用します。 – aocall

3

は、それが最初に見えるかもしれませんように単純ではありません。幸いなことに、heatmaplyというRパッケージがあります。機能の多くの例はonline vignetteにあります。

例えば

install.packages("ggplot2") 
install.packages("plotly") 
install.packages("heatmaply") 

library(heatmaply) 
heatmaply(scale(mtcars), k_row = 3, k_col = 2) 

enter image description here

この図は完全にインタラクティブである(両方のヒートマップおよび樹状図から)。 dendextend(ggdendroのより開発されたバージョンで、ブランチカラー/ラインタイプ/ライン幅も考慮に入れることができます)

特にsetting the margins of the dendrogramsは未解決の問題ですおそらくすぐに解決されるでしょう。

+0

ありがとう@Tal Galili。ヒートマップは素晴らしく見えます。セルノートは数値ではなく文字マトリックスであるヒートマップオブジェクトを作成する方法がありますか?その目的は、細胞上にマウスを置くと、行および列のラベルに加えてテキスト情報を表示することである(例えば、ヒートマップのサンプルによる遺伝子発現であれば、その遺伝子の説明、そのアクセス権などを表示したい)。私はこのような文字マトリックスをセルノートに渡そうとしましたが、クラッシュします。どんな解決策ですか? – user1701545

+0

さらに、ヒートマップのRowvとColvにggdendオブジェクトを渡そうとしましたが、表示されませんでした。 – user1701545

+0

こんにちは@ user1701545。 (1)セルノートに関する興味深いアイディア。小さな自己完結型の例を作成して、私たちにhttps://github.com/talgalili/heatmaply/issues(2)を見せるように問題を提出してください。通常の樹形図を渡すべきです(多分dendextend :: color_branchesを使ってそれを修正してください) RowvとColvにすべてのggdend操作は、関数内で実行されます。 –

関連する問題