2013-12-18 20 views
6

Sto provando a confrontare i dati usando heatmaps. Voglio impostare la scala dei colori per essere uguale per tutti loro. per esempio, tutti sulla scala per valori da -0.5 a 0.5;imposta la scala di colori per heatmap

Ho utilizzato gplots redgreen (50). ma le intensità di colore sono ridimensionate su diversi set di dati .

ad esempio: my mymatrix può variare da -1 a +1; e la mia r1.matrix può variare da -0.2 a +0.2. tracciando i due heatmap, se mettendo sulla stessa scala di colori, mi aspetterei il colore per r1.matrix essere molto dimmer

hm <- heatmap(r.matrix, Colv = NA, col = redgreen(50)) 
hm1 <- heatmap(r1.matrix, Colv = NA, col = redgreen(50)) 

La scala cromatica si estenderà su tutta la gamma di dati, quindi con lo stesso Redgreen (50) sarà lo stesso rosso o verde per i dati che vanno da -1 a +1 e per i dati che vanno da -2 a +2. il motivo per cui il colore si estende su [-1,1] sui dati che vanno da [-.2, .2] è quello di essere in grado di visualizzare la differenza di dati, senza esaminare o conoscere l'intervallo di dati: un passo esplorativo.

risposta

4

Il comando redgreen(50) è indipendente dai valori effettivi e restituisce un vettore di 50 colori. Puoi usare questo vettore a colori ed estrarne un sottoinsieme per adattarlo alla seconda matrice.

Un esempio:

set.seed(1) 
r.matrix <- matrix(runif(16, -1, 1), 4, 4) 
r1.matrix <- r.matrix/5 

I valori nella matrice r1.matrix sono un quinto dei valori r.matrix.

Ora, i vettori di colore possono essere creati nel modo seguente:

library(gplots) 

rg <- redgreen(50)  # the original color vector 

# range of values in first matrix around median 
r1 <- range(r.matrix) - median(r.matrix) 
# range of values in second matrix around median 
r2 <- range(r1.matrix) - median(r1.matrix) 
# relative distances to median of second compared to first matrix 
prop <- r1/r2 

# center of colcor vector 
cent <- length(rg)/2 + 0.5 

# calculate indices of shorter color vector for the second matrix 
ind <- cent/prop 
idx <- round(cent - c(1, -1) * ind) 

# new color vector 
rg_new <- rg[Reduce(seq, idx)] 

Utilizzare questi vettori per colorare le mappe di calore:

enter image description here

heatmap(r1.matrix, Colv = NA, col = rg_new) 

enter image description here

012.

L'intervallo di colori nella seconda mappa termica è inferiore all'intervallo nella prima mappa termica.

+0

Grazie Sven Hohenstein - La scala del colore si estenderà nell'intervallo di dati, quindi con lo stesso redgreen (50) sarà lo stesso rosso o verde per i dati che vanno da -1 a +1 e per i dati che vanno da -2 a +.2. ma la ragione per lasciare che il colore si estenda su [-1,1] sui dati che vanno [-.2, .2] deve essere in grado di visualizzare la differenza nei dati. Quanta differenza tra i due set di dati è sconosciuta ... – user2783615

+0

@ user2783615 Ho aggiornato la risposta. Ora, la creazione del secondo vettore di colori è possibile senza conoscere prima l'intervallo della matrice 2 (ma deve essere più piccolo). –

+0

Grazie mille Sven! La tua è una buona soluzione. Ho finito per combinare tutte le matrici post-clustering e ho aggiunto colonne vuote in mezzo, quindi li ho tracciati insieme, in modo da metterli sulla stessa scala. Comunque, ha dato buoni aiuti visivi. – user2783615

Problemi correlati