mapa hacer como calor r ggplot2 grid heatmap dendrogram

hacer - Combinando un mapa de calor y un dendrograma en un diagrama grob



como hacer un mapa de calor (1)

cowplot es muy buena para alinear ggplots.

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

Además, trate de tener un ejemplo un poco más breve (¿por qué necesito una llamada al theme súper detallada?) Y asegúrese de que realmente se ejecute en una sesión limpia.

heatmap trazar un heatmap junto con un dendrogram hilera, que grid.draw ( grid.draw el número de ramas), grid.draw con grid.draw .

Aquí están mis datos:

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

La parte del heatmap de heatmap de la trama:

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

Lo que da:

Observe las largas etiquetas de columna, que es similar a lo que tengo en realidad.

Así es como manipulo y trazo el 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)

lo que da:

Tratando de seguir este ejemplo , lo hago:

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)

Pero esto sale mal:

¿Alguna idea de cómo hacer que dend.plot alinee con la parte del map.plot de map.plot de map.plot manera que la rama inferior de dend.plot esté alineada en la parte inferior con el heatmap y no la parte inferior de las etiquetas de las columnas?