У меня есть (выражение гена из набора образцов) heatmap
:Присоединение дендрограммы и 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("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"))
require(ggplot2)
map1.plot <- ggplot(mat.df,aes(x=sample,y=gene))+geom_tile(aes(fill=expr))+scale_fill_gradient2("expr",high="darkred",low="darkblue")+scale_y_discrete(position="right")+
theme_bw()+theme(plot.margin=unit(c(1,1,1,-1),"cm"),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"))
(левая сторона получает отрезаны из-за plot.margin
аргументов, которые я нахожусь но мне нужно это для того, что показано ниже).
Тогда я prune
строку dendrogram
в соответствии со значением глубины среза, чтобы получить меньше кластеров (то есть, только глубокие расколы), и сделать некоторые изменения в результате dendrogram
, чтобы он графический они, как я хочу:
depth.cutoff <- 11
dend <- cut(dend,h=depth.cutoff)$upper
require(dendextend)
gg.dend <- as.ggdend(dend)
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] <- "black"
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 <- "black"
dend1.plot <- ggplot(gg.dend,labels=F)+scale_y_reverse()+coord_flip()+theme(plot.margin=unit(c(1,-3,1,1),"cm"))+annotate("text",size=5,hjust=0,x=gg.dend$label$x,y=gg.dend$label$y,label=gg.dend$label$label,colour=gg.dend$label$col)
И я сюжет их вместе с помощью cowplot
«s plot_grid
:
require(cowplot)
plot_grid(dend1.plot,map1.plot,align='h',rel_widths=c(0.5,1))
Хотя align='h'
работает, он не идеален.
Plotting ип-вырезать dendrogram
с использованием map1.plot
plot_grid
иллюстрирует это:
dend0.plot <- ggplot(as.ggdend(dend))+scale_y_reverse()+coord_flip()+theme(plot.margin=unit(c(1,-1,1,1),"cm"))
plot_grid(dend0.plot,map1.plot,align='h',rel_widths=c(1,1))
ветви в верхней и нижней части dendrogram
, кажется, сплющенные по направлению к центру. Игра с scale
, по-видимому, является способом ее корректировки, но значения шкалы, похоже, зависят от фигуры, поэтому мне интересно, есть ли способ сделать это более принципиально.
Далее, я делаю анализ терминов по обогащению на каждом кластере моего heatmap
. Предположим, что этот анализ дал мне этот data.frame
:
enrichment.df <- data.frame(term=rep(paste("t",1:10,sep=""),nrow(gg.dend$labels)),
cluster=c(sapply(1:nrow(gg.dend$labels),function(i) rep(i,5))),
score=rgamma(10*nrow(gg.dend$labels),0.2,0.7),
stringsAsFactors = F)
То, что я хотел бы сделать, это сюжет этот data.frame
как heatmap
и место разреза dendrogram
ниже него (подобно тому, как она расположена в левой части выражения heatmap
) ,
Так что я попытался plot_grid
снова думать, что align='v'
будет работать здесь:
Первый регенерировать дендрограммы участок, имеющий его лицевой стороной вверх:
dend2.plot <- ggplot(gg.dend,labels=F)+scale_y_reverse()+theme(plot.margin=unit(c(-3,1,1,1),"cm"))
Сейчас пытаются построить их вместе:
plot_grid(map2.plot,dend2.plot,align='v')
plot_grid
не кажется, чтобы быть в состоянии выровнять их, как показано на рисунке и предупреждающим сообщением оно проливает:
In align_plots(plotlist = plots, align = align) :
Graphs cannot be vertically aligned. Placing graphs unaligned.
Что, кажется, чтобы получить близко это:
plot_grid(map2.plot,dend2.plot,rel_heights=c(1,0.5),nrow=2,ncol=1,scale=c(1,0.675))
Это достигается после игры с параметром scale
, хотя сюжет выходит слишком широко. Так что еще раз, мне интересно, есть ли способ обойти это или как-то предопределить, что является правильным scale
для любого данного списка dendrogram
и heatmap
, возможно, по их размерам.
Привет Dan.Почему вы пытаетесь воссоздать тепловую карту (которая уже реализована в различных пакетах)? Что мне здесь не хватает? –
Что я делаю, это резка дендрограммы, чтобы найти количество значимых кластеров. К сожалению, Dynamic Tree Cut не показал хорошей производительности вообще. Но вопрос в основном связан с объединением дерева разреза с тепловой картой анализа обогащения. Можете ли вы указать мне на пакет, который это реализует? – dan
BTW, Tal Galili, я не думаю, что есть принципиальный способ построения ggdend dendrograms с помощью Heatmap с использованием ggplot, поэтому использование plot_grid из cowplot может быть хорошим решением. – dan