2017-03-06 78 views
4

我想能夠面對一個Rplotlyheatmap刻畫一個陰謀熱圖

這裏就是我的意思是: 我有一個分層聚類基因表達數據集:

require(permute) 
set.seed(1) 
mat <- rbind(cbind(matrix(rnorm(2500,2,1),nrow=25,ncol=500),matrix(rnorm(2500,-2,1),nrow=25,ncol=500)), 
      cbind(matrix(rnorm(2500,-2,1),nrow=25,ncol=500),matrix(rnorm(2500,2,1),nrow=25,ncol=500))) 
rownames(mat) <- paste("g",1:50,sep=".") 
colnames(mat) <- paste("s",1:1000,sep=".") 
hc.col <- hclust(dist(t(mat))) 
dd.col <- as.dendrogram(hc.col) 
col.order <- order.dendrogram(dd.col) 
hc.row <- hclust(dist(mat)) 
dd.row <- as.dendrogram(hc.row) 
row.order <- order.dendrogram(dd.row) 
mat <- mat[row.order,col.order] 

我則離散具體表達的範圍,因爲這正好幫助的顏色分辨率爲我的情況。我還創建了另外的結構,以幫助我繪製colorbar我希望它的方式:

require(RColorBrewer) 
mat.intervals <- cut(mat,breaks=6) 
interval.mat <- matrix(mat.intervals,nrow=50,ncol=1000,dimnames=list(rownames(mat),colnames(mat))) 
interval.cols <- brewer.pal(6,"Set2") 
names(interval.cols) <- levels(mat.intervals) 
require(reshape2) 
interval.df <- reshape2::melt(interval.mat,varnames=c("gene","sample"),value.name="expr") 
interval.cols2 <- rep(interval.cols, each=ncol(mat)) 
color.df <- data.frame(range=c(0:(2*length(interval.cols)-1)),colors=c(0:(2*length(interval.cols)-1))) 
color.df <- setNames(data.frame(color.df$range,color.df$colors),NULL) 
for (i in 1:(2*length(interval.cols))) { 
    color.df[[2]][[i]] <- interval.cols[[(i + 1)/2]] 
    color.df[[1]][[i]] <- i/(2*length(interval.cols))-(i %% 2)/(2*length(interval.cols)) 
} 

他們這樣,我產生的數據我知道樣品1-500是一個集羣和樣品501:1000是其他的,所以我標號:

interval.df$cluster <- NA 
    interval.df$cluster[which(interval.df$sample %in% paste("s",1:500,sep="."))] <- "A" 
    interval.df$cluster[which(interval.df$sample %in% paste("s",501:1000,sep="."))] <- "B" 

我認爲這增加了樣品與不變色和間隔將創建在heatmap情節白色列會看起來像一個小邊框:

divider.df <- data.frame(gene=unique(interval.df$gene),sample=NA,expr=NA,cluster=NA) 
interval.df <- rbind(dplyr::filter(interval.df,cluster == "A"),divider.df,dplyr::filter(interval.df,cluster == "B")) 

現在我嘗試繪製:

#add ticks for each cluster 
tick.vals <- c("s.158","s.617") 
tick.text <- c("A","B") 

require(plotly) 
plot_ly(z=c(interval.df$expr),x=interval.df$sample,y=interval.df$gene,colors=interval.cols2,type="heatmap",colorscale=color.df, 
          colorbar=list(title="score",tickmode="array",tickvals=c(1:6),ticktext=names(interval.cols),len=0.2,outlinecolor="white",bordercolor="white",borderwidth=5,bgcolor="white")) %>% 
    layout(xaxis = list(title = 'Cluster',tickmode = 'array',tickvals = tick.vals,ticktext = tick.text)) 

但我沒有看到集羣之間的分離: enter image description here

任何想法如何實現兩個集羣之間的這種小的邊界?

+0

您是否嘗試過使用'plotly :: subplot'?我還注意到你的* y軸不是有序的,你打算如何解釋你的熱圖? –

+0

這只是一個例子,所以我不打擾在這篇文章中的代碼中訂購y軸。實際上它會經歷一個集羣部分。我還沒有試過這個副劇場選項。會嘗試 – dan

回答

3

您的示例非常有用,因此我將它簡化爲一個最小示例,以便關注您在熱圖的象限中尋找的差距。

情節網站,here的實例修改。

library(plotly) 

m <- matrix(rnorm(9), nrow = 3, ncol = 3) 

p <- plot_ly(
    x = c("a", "b", "c"), y = c("d", "e", "f"), 
    z = m, type = "heatmap" 
) 

subplot(p, p, p, p, shareX = TRUE, shareY = TRUE, nrows = 2) 

如果每個象限的創建plotly對象,然後使用subplot,你會得到一個結果來看與此類似:

enter image description here

注:我已經裁剪出這個傳說,因爲它是爲了方面而重複的,你可以將它們合併成一個。