Объединение тепловой карты и дендрограммы в гроб-график

Я пытаюсь построить heatmap вместе со строкой dendrogram, которой я манипулировал (сокращал количество ветвей), выровненной с помощью grid.draw.

Вот мои данные:

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"))

Который дает:

введите здесь описание изображения

Обратите внимание на длинные метки столбцов — это похоже на то, что у меня есть на самом деле.

Вот как я манипулирую и рисую 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)

который дает:

введите здесь описание изображения

Пытаясь следовать этому примеру, я делаю:

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)

Но это выходит запутанным: введите здесь описание изображения

Есть идеи, как выровнять dend.plot с heatmap частью map.plot, чтобы нижняя ветвь dend.plot была выровнена по нижнему краю с heatmap, а не по нижнему краю меток столбца?


person dan    schedule 03.02.2017    source источник
comment
Извини за это. Я удалил это из своего поста.   -  person dan    schedule 03.02.2017
comment
Казалось бы, проще добавить дендрограмму в gtable тепловой карты.   -  person baptiste    schedule 03.02.2017
comment
В вашем вопросе многое происходит. (1) рассмотрите возможность использования dendextend::color_branches (2) как правило, вы можете комбинировать дендрограмму с тепловой картой (например, в gplots::heatmap.2), указав свою дендрограмму в параметре Rowv. Вы можете видеть это в следующих примерах: cran.r -project.org/web/packages/dendextend/vignettes/ (3) наконец, взгляните на пакет Heatmaply: cran.r-project.org/web/packages/heatmaply/vignettes/   -  person Tal Galili    schedule 04.02.2017


Ответы (1)


cowplot отлично справляется с выравниванием ggplots.

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

введите здесь описание изображения

Кроме того, постарайтесь сделать пример немного короче (зачем мне нужен сверхдетализированный вызов theme?) и убедитесь, что он действительно работает в чистом сеансе.

person Axeman    schedule 03.02.2017
comment
Еще один вопрос: как устранить большой разрыв между дендрограммой и тепловой картой? Я попытался добавить plot.margin=unit(c(0,0,0,0),cm) к теме как map.plot, так и dend.plot и поэкспериментировать с масштабом и rel_widths в plot_grid, но, похоже, ни один из них не работает. - person dan; 04.02.2017
comment
Неважно. Разобрался - нужно указать отрицательные значения в plot.margin - person dan; 04.02.2017