2017-03-06 4 views
4

Ich würde gerne in der Lage sein, eine R facettieren.Faceting eine plotly Heatmap

Hier ist, was ich meine: Ich habe einen hierarchisch gruppierten Genexpression-Datensatz:

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] 

ich diskretisieren es dann zu spezifischem Ausdruck reicht, weil das die Auflösung von Farben für meinen Fall zu helfen, geschieht. Ich bin auch andere Strukturen zu schaffen, mir zu helfen die colorbar den Weg plotten ich es will:

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

Sie Art, wie ich die Daten, die ich weiß, dass die Proben 1-500 sind ein Cluster und Proben 501: 1000 sind die andere, so beschriften ich sie:

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" 

ich dachte, dass mit nicht Farbe und Intervall eine weiße Säule in der heatmap Plot wird erstellen Zugabe einer Probe, die wie eine Facette Grenze aussehen:

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

Und jetzt versuche ich Plotten:

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

Aber ich sehe keine Trennung zwischen den Clustern: enter image description here

Jede Idee, wie man eine solche Facette Grenze zwischen den beiden Clustern zu erreichen?

+0

Haben Sie versucht, 'plotly :: subplot' zu verwenden? Ich bemerke auch, dass deine * y * -Achse nicht geordnet ist, wie soll deine Heat Map interpretiert werden? –

+0

Dies ist nur ein Beispiel, also habe ich mich nicht damit beschäftigt, die y-Achse im Code in diesem Beitrag zu bestellen. In Wirklichkeit würde es einen Clustering-Teil durchlaufen. Ich habe die Subplot-Option nicht ausprobiert. Werde versuchen – dan

Antwort

3

Ihr Beispiel ist ziemlich involviert, also habe ich es auf ein minimales Beispiel reduziert, um sich auf die Lücke zu konzentrieren, die Sie in den Quadranten Ihrer Heatmap suchen.

Geändert von den Beispielen auf der Plot Website, 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) 

Wenn Sie ein plotly Objekt für jeden der Quadranten erstellen und dann subplot verwenden, werden Sie ein Ergebnis der Suche ähnlich wie diese:

enter image description here

N. B. Ich habe die Legende abgeschnitten, weil sie für die Facetten dupliziert wurde, Sie könnten diese zu einem zusammenfassen.

Verwandte Themen