2012-06-11 13 views
21

Voglio fare una heatmap in ggplot2. I miei dati di giocattoli e il codice è:ggplot2 mappa di calore con i colori per i valori di distanza

set.seed(12345) 
dat <- 
    data.frame(
     Row = rep(x = LETTERS[1:5], times = 10) 
    , Col = rep(x = LETTERS[1:10], each = 5) 
    , Y = rnorm(n = 50, mean = 0, sd = 1) 
    ) 
library(ggplot2) 
p <- ggplot(data = dat, aes(x = Row, y = Col)) + 
     geom_tile(aes(fill = Y), colour = "white") + 
     scale_fill_gradient(low = "white", high = "steelblue") 
p 

voglio avere combinazione di colori per i valori a distanza come questo:

-3 <= Y < -2 ---> Dark Blue 
-2 <= Y < -1 ---> Blue 
-1 <= Y < 0 ---> Light Blue 
0 <= Y < 1 ---> Light Green 
1 <= Y < 2 ---> Green 
2 <= Y <= 3 ---> Dark Green 

Ogni aiuto sarà molto apprezzato. Grazie

risposta

15

Hai diverse opzioni per qualcosa di simile, ma qui è uno come punto di partenza.

In primo luogo, utilizzare cut per creare un fattore da Y con gli intervalli appropriati:

dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE) 

Poi grafico usando una tavolozza da RColorBrewer:

ggplot(data = dat, aes(x = Row, y = Col)) + 
     geom_tile(aes(fill = Y1), colour = "white") + 
     scale_fill_brewer(palette = "PRGn") 

enter image description here

Questo colore lo schema è più viola del blu nella fascia bassa, ma è il c il più forte che ho trovato tra le palette di birra.

Se si desidera creare il proprio, è sufficiente utilizzare scale_fill_manual e specificare il vettore di colori desiderato per l'argomento values.

+0

Grazie @joran per la risposta. Mi chiedo come cancellare le linee tra due rettangoli delle trame. Grazie – MYaseen208

+0

@ MYaseen208 Imposta 'color =" transparent "' in 'geom_tile'. – joran

+0

Grazie mille @joran. Molto apprezzato. – MYaseen208

38

Non è chiaro se si desidera colori discreti o se i colori elencati sono solo indicatori nell'intervallo Y. Mostrerò entrambi

Per i colori discreti, utilizzare Y1 come Joran definisce

dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE) 

allora si può ottenere una trama con i colori che specifici avete elenco utilizzando una scala manuale

p <- ggplot(data = dat, aes(x = Row, y = Col)) + 
     geom_tile(aes(fill = Y1)) + 
     scale_fill_manual(breaks=c("\[-Inf,-3)", "\[-3,-2)", "\[-2,-1)", 
           "\[-1,0)", "\[0,1)", "\[1,2)", 
           "\[2,3)", "\[3, Inf)"), 
         values = c("white", "darkblue", "blue", 
            "lightblue", "lightgreen", "green", 
            "darkgreen", "white")) 
p 

I non sapevo cosa volevi per i colori oltre -3 e 3, quindi ho usato il bianco.

Se si desidera un colore continuo, passando dal blu al negativo passando per il bianco da 0 a verde sul positivo, lo scale_fill_gradient2 funzionerebbe.

ggplot(data = dat, aes(x = Row, y = Col)) + 
    geom_tile(aes(fill = Y)) + 
    scale_fill_gradient2(low="darkblue", high="darkgreen", guide="colorbar") 

enter image description here

Se si desidera il controllo dettagli fini del colore, in modo tale che la mappatura è "blu scuro" a 3, "blu" a 2, "azzurro" alla 1, "bianco" a 0, ecc, quindi scale_fill_gradientn lavorerà per voi:

library("scales") 
ggplot(data = dat, aes(x = Row, y = Col)) + 
    geom_tile(aes(fill = Y)) + 
    scale_fill_gradientn(colours=c("darkblue", "blue", "lightblue", 
           "white", 
           "lightgreen", "green", "darkgreen"), 
         values=rescale(c(-3, -2, -1, 
             0, 
             1, 2, 3)), 
         guide="colorbar") 

+0

Grazie a @Brian per la bella risposta. Sei un mago di ggplot2.Molto apprezzato il tuo aiuto. – MYaseen208

Problemi correlati