2017-02-03 8 views
3

grid.drawを使用して整列(枝数を整理)したdendrogram行とともにheatmapをプロットしようとしています。ヒートマップと樹状図を組み合わせてプロットする

ここに私のデータです:

set.seed(10) 
mat  <- matrix(rnorm(24*10,mean=1,sd=2),nrow=24,ncol=10,dimnames=list(paste("g",1:24,sep=""),paste("my.expriment.sample",1:10,sep=""))) 
dend <- as.dendrogram(hclust(dist(mat))) 
row.ord <- order.dendrogram(dend) 
mat  <- matrix(mat[row.ord,],nrow=24,ncol=10, 
      dimnames=list(rownames(mat)[row.ord],colnames(mat))) 
mat.df <- reshape2::melt(mat,value.name="expr",varnames=c("gene","sample")) 

プロットのheatmap一部:

require(ggplot2) 
map.plot <- ggplot(mat.df,aes(x=sample,y=gene)) + geom_tile(aes(fill=expr)) + 
    scale_fill_gradient2("expr",high="darkred",low="darkblue") + theme_bw() + 
    theme(legend.key=element_blank(),legend.position="right", axis.text.y=element_blank(), axis.ticks.y=element_blank(), 
    panel.border=element_blank(), strip.background=element_blank(), axis.text.x=element_text(angle=45,hjust=1,vjust=1), 
    legend.text=element_text(size=5), legend.title=element_text(size=8), legend.key.size=unit(0.4,"cm")) 

います:

enter image description here

お知らせ長い列ラベルを - それがに似ていますが、私が実際に持っているもの。ここで

は、私が操作しdendrogramをプロット方法は次のとおりです。

depth.cutoff <- 11 
dend <- cut(dend,h=depth.cutoff)$upper 
require(dendextend) 
gg.dend <- as.ggdend(dend) 

#change vertical segments that lead to leaves 
distinctColors <- function(n) { 
    if (n <= 8) { 
    res <- brewer.pal(n, "Set2") 
    } else { 
    res <- hcl(h=seq(0,(n-1)/(n),length=n)*360,c=100,l=65,fixup=TRUE) 
    } 
} 

cluster.cols <- distinctColors(nrow(gg.dend$labels)) 
leaf.heights <- dplyr::filter(gg.dend$nodes,!is.na(leaf))$height 
leaf.seqments.idx <- which(gg.dend$segments$yend %in% leaf.heights) 
gg.dend$segments$yend[leaf.seqments.idx] <- max(gg.dend$segments$yend[leaf.seqments.idx]) 
gg.dend$segments$col[leaf.seqments.idx] <- cluster.cols 

#change labels 
gg.dend$labels$label <- 1:nrow(gg.dend$labels) 
gg.dend$labels$y <- max(gg.dend$segments$yend[leaf.seqments.idx]) 
gg.dend$labels$x <- gg.dend$segments$x[leaf.seqments.idx] 
gg.dend$labels$col <- cluster.cols 
dend.plot <- ggplot(gg.dend,labels=F)+scale_y_reverse()+coord_flip()+annotate("text",size=10,hjust=0,x=gg.dend$label$x,y=gg.dend$label$y,label=gg.dend$label$label,colour=gg.dend$label$col) 

与える:

enter image description here

this exampleに従うことをしようと、私が行います

require(gtable) 
plot.grob <- ggplotGrob(dend.plot) 
plot.grob <- gtable_add_cols(plot.grob,unit(1,"cm")) 
plot.grob <- gtable_add_grob(plot.grob,ggplotGrob(map.plot),t=1,l=ncol(plot.grob),b=1,r=ncol(plot.grob)) 
grid.newpage() 
grid.draw(plot.grob) 

しかし、これは来ますうんざりする: enter image description here

dend.plotdend.plotの下分岐がheatmapとない列ラベルの底部と下部に整列されるようにmap.plotheatmap一部と一致取得する方法任意のアイデア?

+0

'ラボのエラー(y = lab.row、x = lab.col):オブジェクト 'lab.row'が見つかりませんでした ' – Axeman

+0

残念です。私は私のポストからそれを削除しました。 – dan

+1

ヒートマップのgtableに樹状図を追加する方がより簡単に思えます – baptiste

答えて

1

cowplotはggplotsを整列させるのに優れています。

library(cowplot) 
plot_grid(dend.plot, map.plot, align = 'h') 

enter image description here

また、(なぜ私はスーパーの詳細themeコールが必要なのでしょうか?)少し短い例を持ってしようと、それが実際にきれいなセッションで実行してください。

+0

さらにもう1つの質問:デンドログラムとヒートマップの間の大きなマージンをどのように排除しますか?私はmap.plotとdend.plotの両方のテーマにplot.margin = unit(c(0,0,0,0)、 "cm"を追加してplot_gridで縮尺とrel_widthsを使って遊んだが、実際には動作しないようだ) – dan

+1

気にしないでください。plot.marginに負の値を指定する必要があります – dan

関連する問題