2017-03-06 4 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] 

내가 다음 특정 표현에 이산화 : 나는 계층 클러스터 유전자 발현 데이터 세트를 :

여기 무슨 뜻입니다. (501) 내가 샘플 ~ 500은 하나 개의 클러스터 것을 알고 그들은 방법 내가 데이터를 생성

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

및 샘플 : 나는 또한 다른 나를 colorbar에게 내가 그것을 원하는 방식으로 그릴 수 있도록 구조를 만드는거야 1000을하다 다른, 그래서 나는 그들을 레이블 :

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

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 음모에 흰색 열을 만들 것이라고 생각

그리고 지금은 플로팅 시도 :

#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 축을 정렬하는 것을 고민하지 않았습니다. 실제로는 클러스터링 부분을 통과합니다. 나는 subplot 옵션을 시도하지 않았다. 시도 할 것이다 – 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

N.B. 전설을 복제했기 때문에 전설을 잘라 냈습니다.이 전설을 하나로 합칠 수있었습니다.