2012-06-11 48 views
21

Quiero hacer un mapa de calor en ggplot2. Mis datos de juguete y el código es:mapa de calor ggplot2 con colores para valores a rangos

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 

Quiero tener combinación de colores para valores de rango como este:

-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 

Cualquier ayuda será apreciada altamente. Gracias

Respuesta

15

Tiene varias opciones para algo como esto, pero aquí hay uno como punto de partida.

primer lugar, utilizar cut para crear un factor de Y con los rangos apropiados:

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

Entonces gráfico utilizando una paleta de 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

Este color esquema es más púrpura que azul en el extremo inferior, pero es la c Losest podría encontrar entre la paleta de cerveza.

Si desea construir el suyo, simplemente puede usar scale_fill_manual y especificar el vector de colores deseado para el argumento values.

+0

Gracias @joran por su respuesta. Me pregunto cómo borrar las líneas entre dos rectángulos de las tramas. Gracias – MYaseen208

+0

@ MYaseen208 Establecer 'color =" transparent "' en 'geom_tile'. – joran

+0

Muchas gracias @joran. Muy apreciado. – MYaseen208

38

No está claro si desea colores discretos o si los colores que enumera son solo marcadores a lo largo del rango de Y. Mostraré ambos.

Para colores discretos, utilice Y1 como Joran define

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

entonces se puede obtener una parcela con los colores específicos que la lista utilizando una escala manual de

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 no sabía lo que quería para los colores más allá de -3 y 3, así que usé el blanco.

Si quisiera un color continuo, pasar de azul en negativo a blanco en 0 a verde en positivo, scale_fill_gradient2 funcionaría.

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

Si desea un control de detalle fino de color, de forma que la asignación es "azul oscuro" a las 3, "azul" a los 2, "azul claro" a 1, "blanco" a los 0, etc., entonces scale_fill_gradientn funcione para usted:

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

Gracias @Brian por una buena respuesta. Eres el asistente de ggplot2.Muy apreciado tu ayuda. – MYaseen208

Cuestiones relacionadas