2017-05-05 7 views
4

Ich bin dabei this example zum Erstellen einer Cluster-Heatmap mit Dendrogramme mit Rplotly. Hier ist das Beispiel:Plotten einer Cluster-Heatmap mit Dendrogrammen unter Verwendung von Rs plotly

library(ggplot2) 
library(ggdendro) 
library(plotly) 

#dendogram data 
x <- as.matrix(scale(mtcars)) 
dd.col <- as.dendrogram(hclust(dist(x))) 
dd.row <- as.dendrogram(hclust(dist(t(x)))) 
dx <- dendro_data(dd.row) 
dy <- dendro_data(dd.col) 

# helper function for creating dendograms 
ggdend <- function(df) { 
    ggplot() + 
    geom_segment(data = df, aes(x=x, y=y, xend=xend, yend=yend)) + 
    labs(x = "", y = "") + theme_minimal() + 
    theme(axis.text = element_blank(), axis.ticks = element_blank(), 
      panel.grid = element_blank()) 
} 

# x/y dendograms 
px <- ggdend(dx$segments) 
py <- ggdend(dy$segments) + coord_flip() 

# heatmap 
col.ord <- order.dendrogram(dd.col) 
row.ord <- order.dendrogram(dd.row) 
xx <- scale(mtcars)[col.ord, row.ord] 
xx_names <- attr(xx, "dimnames") 
df <- as.data.frame(xx) 
colnames(df) <- xx_names[[2]] 
df$car <- xx_names[[1]] 
df$car <- with(df, factor(car, levels=car, ordered=TRUE)) 
mdf <- reshape2::melt(df, id.vars="car") 
p <- ggplot(mdf, aes(x = variable, y = car)) + geom_tile(aes(fill = value)) 

mat <- matrix(unlist(dplyr::select(df,-car)),nrow=nrow(df)) 
colnames(mat) <- colnames(df)[1:ncol(df)-1] 
rownames(mat) <- rownames(df) 

# hide axis ticks and grid lines 
eaxis <- list(
    showticklabels = FALSE, 
    showgrid = FALSE, 
    zeroline = FALSE 
) 

p_empty <- plot_ly(filename="r-docs/dendrogram") %>% 
    # note that margin applies to entire plot, so we can 
    # add it here to make tick labels more readable 
    layout(margin = list(l = 200), 
     xaxis = eaxis, 
     yaxis = eaxis) 

subplot(px, p_empty, p, py, nrows = 2, margin = 0.01) 

die gibt:

enter image description here

ich den Code geändert ein bisschen so, dass in meinem Fall die Heatmap mit plotly erzeugt wird, anstatt ggplot, da es schneller läuft auf meinem realen big Data, also ich tun:

heatmap.plotly <- plot_ly() %>% add_heatmap(z=~mat,x=factor(colnames(mat),lev=colnames(mat)),y=factor(rownames(mat),lev=rownames(mat))) 

Und dann:

subplot(px, p_empty, heatmap.plotly, py, nrows = 2, margin = 0.01) 

die gibt: enter image description here

Meine Fragen sind:

  1. Wie erhalte ich die Zeilen- und Spaltenbeschriftungen der Heatmap nicht schneiden lassen ab, wie sie in den beiden Parzellen tun?

  2. Das Etikett des Colorers wird in der zweiten Abbildung in "matt" geändert. Irgendeine Idee, wie man das verhindert?

  3. Wie ändere ich die Ränder zwischen der Heatmap und den Dendrogrammen?

Antwort

0

Wie erhalte ich die Zeilen- und Spaltenbeschriftungen der Heatmap nicht abgeschnitten werden>, wie sie in den beiden Parzellen zu tun?

Versuchen Sie, die margin s Einstellung nach dem Plot

sply <- subplot(px, p_empty, heatmap.plotly, py, nrows = 2) 
sply <- layout(sply, 
       margin = list(l = 150, 
          r = 0, 
          b = 50, 
          t = 0 
          ) 
       ) 

Das Etikett der colorer geändert wird, um in der zweiten Figur "Matte" erzeugt wurde. Irgendwelche Idee, wie man das verhindert?

Keine Ahnung, wie Sie es verhindern können, aber Sie können das Etikett überschreiben.

sply$x$data[[3]]$colorbar$title <- 'mat' 

Wie ändere ich die Ränder zwischen der Heatmap und dem Dendrogramme?

Sie können domain für jede Achse jedes Teilplots angeben. yaxis entspricht der Handlung in der linken oberen Ecke, yaxis2 der Handlung in der rechten Seite, usw.

Das Vergrößern der Entfernung funktioniert besser als das Verringern.

sply <- layout(sply, 
       yaxis = list(domain=c(0.47, 1)), 
       xaxis = list(domain=c(0, 0.5)), 
       xaxis3 = list(domain=c(0, 0.5)), 
       xaxis4 = list(domain=c(0.5, 1)), 
       ) 

enter image description here

pl <- subplot(px, p_empty, p, py, nrows = 2) 
heatmap.plotly <- plot_ly() %>% add_heatmap(z=~mat,x=factor(colnames(mat),lev=colnames(mat)),y=factor(rownames(mat),lev=rownames(mat))) 
sply <- subplot(px, p_empty, heatmap.plotly, py, nrows = 2) 
sply$x$data[[3]]$colorbar$title <- 'mat' 
sply <- layout(sply, 
       yaxis = list(domain=c(0.47, 1)), 
       xaxis = list(domain=c(0, 0.5)), 
       xaxis3 = list(domain=c(0, 0.5)), 
       xaxis4 = list(domain=c(0.5, 1)), 
       margin = list(l = 150, 
          r = 0, 
          b = 50, 
          t = 0 
          ) 


       ) 

sply 
+0

Ich würde 'colorbar (sply, title =" mat ")' anstatt direkt auf Felder in Plotly-Objekten zugreifen, da die Schnittstelle etwas anfällig für Änderungen ist. – aocall

3

mit plotly ein voll funktionsfähigen Cluster Heatmap zu machen ist nicht so einfach, wie es am Anfang scheint. Zum Glück gibt es ein R-Paket namens heatmaply, das genau das tut. Sie können viele Beispiele für Funktionen in der online vignette sehen.

Zum Beispiel:

install.packages("ggplot2") 
install.packages("plotly") 
install.packages("heatmaply") 

library(heatmaply) 
heatmaply(scale(mtcars), k_row = 3, k_col = 2) 

enter image description here

Diese Zahl ist voll interaktiv (beide von der Heatmap und Dendrogramm). Beachten Sie, dass es dendextend (eine weiterentwickelte Version von ggdendro, die auch nur für Zweigfarben/Linientyp/Linienbreite berücksichtigen kann) verwendet

Speziell ist ein offenes Problem (ab heute), aber das wird wahrscheinlich bald gelöst werden.

+0

Danke @Tal Galili. Heatmaply sieht gut aus. Gibt es eine Möglichkeit, ein Heatmapr-Objekt zu erstellen, bei dem die Zellennummer eine Zeichenmatrix und nicht numerisch ist? Der Zweck besteht darin, dass der Mauszeiger über einer Zelle Textinformationen zusätzlich zu den Zeilen- und Spaltenbeschriftungen anzeigt (z. B. wenn dies ein Genexpressionsmuster ist, möchte ich eine Beschreibung des Gens, seines Beitritts usw. anzeigen). Ich habe versucht, eine solche Zeichenmatrix an die Zellennummer zu übergeben, aber es stürzt ab. Irgendeine Lösungsmöglichkeit? – user1701545

+0

Außerdem habe ich versucht, ggend Objekte in Heatmapr an Rowv und Colv zu übergeben, aber sie wurden nicht angezeigt. – user1701545

+0

Hallo @ user1701545. (1) bezüglich der Zellnotiz, interessante Idee. Bitte erstellen Sie ein kleines, in sich geschlossenes Beispiel und senden Sie uns ein Problem, damit wir uns https://github.com/talgalili/heatmaply/issues (2) ansehen können. Sie sollten ein reguläres Dendrogramm übergeben (vielleicht mit denendendend :: color_branches, um es zu modifizieren). nach Rowv und Colv. Alle ggend-Operationen werden innerhalb der Funktion für Sie erledigt. –

Verwandte Themen