2011-12-04 17 views
6

Sto usando R per creare una heatmap da una matrice usando heatmap.2 - e voglio raggruppare queste immagini in un'unica grande immagine - Quello che di solito uso per ottenere questo è layout() - ma questo non funziona, in quanto heatmap.2 utilizza il layout e apparentemente il layout non funziona in modo ricorsivo.layout interno layout in R

Qualcuno ha qualche suggerimento su come raggruppare 2 immagini senza layout, o come rendere il layout supportante le chiamate ricorsive?

mat = matrix(nrow=3,nrow=3,1:9) 
layout(matrix(nrow=2,ncol=1)) 
heatmap.2(mat) ## overrides the layout and produces only one plot that takes whole screen 
heatmap.2(mat) ## still only one image 

grazie.

risposta

6

Quello che segue è un hack che non è quasi certamente una soluzione perfetta, ma potrebbe farti iniziare.

Creare la propria versione della funzione heatmap.2 denominata hm3. Nel codice per hm3, commentate tutte le linee tra:

if (missing(lhei) || is.null(lhei)) 

e la chiamata layout:

layout(lmat, widths = lwid, heights = lhei, respect = FALSE) 

è un grande pezzo di codice, forse 30 linee. Ora il seguente codice produce due mappe di calore con dendrogrammi e le chiavi fianco a fianco:

x <- as.matrix(mtcars) 
lhei <- c(1.5, 4,1.5,4) 
lwid <- c(1.5, 4,1.5,4) 
layout(rbind(c(4,3,8,7),c(2,1,6,5)), 
    widths = lwid, heights = lhei, respect = FALSE) 
hm3(x) 
hm3(x) 

enter image description here

Chiaramente, questo richiederà notevoli modifiche per far sembrare bello (e una più grande area di tracciare; ho schiacciato tutto per essere di dimensioni ragionevoli per postare qui).

Questo è completamente non testato. È probabile che l'utilizzo di una delle opzioni nella funzione hm3 che controlla l'aspetto della trama causerà un lieve errore. Ma questo potrebbe essere un buon punto di partenza per la tua stessa sperimentazione per affrontare questi problemi.

+0

Grazie - Peccato che non ci sia un modo più semplice per farlo ... Lascio la domanda aperta un po 'di più nel caso qualcuno sappia di una soluzione più generica, ma sembra che la vita sia dura e la tua soluzione è il migliore (anche se probabilmente risolverò il mio problema invece di giocare con il codice heatmap che non sembra divertente). – dan12345

1

Cosa pensi di fare con i risultati?

Se si desidera confrontare 2 mappe di calore una accanto all'altra sullo schermo, invece di unirle in un unico grafico è possibile aprire 2 dispositivi di tracciamento e disporli l'uno accanto all'altro per confrontare (molto più semplice della creazione di un singolo grafico) :

heatmap.2(mat1) 
dev.new() 
heatmap.2(mat2) 

Ora trascinare uno di fianco all'altro utilizzando il mouse.

Se si desidera includere l'immagine combinata in una pubblicazione, può essere più semplice creare i 2 grafici e impostarli uno accanto all'altro in qualsiasi programma si usi per creare l'articolo. Se ti occorrono in un file, puoi comunque salvare le 2 heatmap (o altri grafici) come 2 file, quindi utilizzare strumenti come imagemagick, gimp o inkscape per combinare i 2 file in 1 con i grafici affiancati.