Tôi có một (biểu hiện gen từ một tập hợp các mẫu) heatmap
:Tham gia một dendrogram và 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"))
(Phía bên trái bị cắt đứt vì plot.margin
lập luận tôi sử dụng nhưng tôi cần điều này cho những gì được hiển thị dưới đây).
Sau đó, tôi prune
hàng dendrogram
theo một giá trị chiều sâu cắt để có được cụm ít hơn (ví dụ, chỉ chia rẽ sâu), và thực hiện một số chỉnh sửa trên kết quả dendrogram
để có nó vẽ họ cách tôi muốn nó:
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)
Và tôi vẽ chúng lại với nhau bằng cowplot
's plot_grid
:
require(cowplot)
plot_grid(dend1.plot,map1.plot,align='h',rel_widths=c(0.5,1))
Mặc dù align='h'
đang hoạt động nhưng không hoàn hảo.
Vẽ các un cắt dendrogram
với map1.plot
sử dụng plot_grid
minh họa điều này:
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))
Các chi nhánh ở phía trên và phía dưới của dendrogram
dường như được squished về phía trung tâm. Chơi xung quanh với các scale
có vẻ là một cách để điều chỉnh nó, nhưng các giá trị quy mô có vẻ là con số cụ thể vì vậy tôi tự hỏi nếu có bất kỳ cách nào để làm điều này một cách nguyên tắc hơn.
Tiếp theo, tôi thực hiện phân tích làm giàu một số cụm từ trên mỗi cụm của heatmap
của tôi. Giả sử phân tích này đã cho tôi này 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)
Những gì tôi muốn làm âm mưu data.frame
này là như một heatmap
và đặt cắt dendrogram
dưới nó (tương tự như cách nó được đặt ở phía bên trái của biểu thức heatmap
) .
Vì vậy, tôi đã cố gắng plot_grid
lại nghĩ rằng align='v'
sẽ làm việc ở đây:
Đầu tiên tạo lại âm mưu dendrogram có nó hướng lên:
dend2.plot <- ggplot(gg.dend,labels=F)+scale_y_reverse()+theme(plot.margin=unit(c(-3,1,1,1),"cm"))
Bây giờ cố gắng để âm mưu chúng với nhau:
plot_grid(map2.plot,dend2.plot,align='v')
.210
plot_grid
dường như không để có thể sắp xếp chúng như hình minh họa và các thông điệp cảnh báo nó ném:
In align_plots(plotlist = plots, align = align) :
Graphs cannot be vertically aligned. Placing graphs unaligned.
gì dường như để có được gần gũi là thế này:
plot_grid(map2.plot,dend2.plot,rel_heights=c(1,0.5),nrow=2,ncol=1,scale=c(1,0.675))
Điều này đạt được sau khi chơi xung quanh với tham số scale
, mặc dù cốt truyện xuất hiện quá rộng. Vì vậy, một lần nữa, tôi tự hỏi nếu có một cách xung quanh nó hoặc bằng cách nào đó xác định trước những gì là đúng scale
cho bất kỳ danh sách nhất định của một dendrogram
và heatmap
, có lẽ bởi kích thước của chúng.
Hi Dan.Tại sao bạn đang cố gắng tạo lại một bản đồ nhiệt (đã được thực hiện trong các gói khác nhau)? Tôi đang thiếu gì ở đây? –
Những gì tôi đang làm là cắt dendrogram để tìm số cụm có ý nghĩa. Thật không may, Dynamic Tree Cut không cho thấy hiệu suất tốt chút nào. Nhưng câu hỏi chủ yếu là về việc kết hợp cây cắt với bản đồ nhiệt của phân tích làm giàu. Bạn có thể chỉ cho tôi gói phần mềm thực hiện điều đó không? – dan
BTW, Tal Galili, tôi không nghĩ rằng có một cách nguyên tắc của âm mưu ggdend dendrograms với một heatmap bằng cách sử dụng ggplot, do đó, sử dụng plotplg's plot_grid có thể là một giải pháp tốt đẹp – dan