guides - legend in r ggplot
Mapa de calor ggplot2 con colores para valores a distancia (2)
Quiero hacer un mapa de calor en ggplot2. Los datos y el código de mi juguete son:
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 un esquema de colores para valores a distancia 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á muy apreciada. Gracias
No está claro si quieres colores discretos o si los colores que mencionas son solo marcadores a lo largo del rango de Y
Mostraré ambos.
Para colores discretos, use Y1
como joran lo define
dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE)
A continuación, puede obtener una trama con los colores específicos que enumera con una escala manual
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
No sabía lo que quería para los colores más allá de -3 y 3, así que usé el blanco.
Si quería un color continuo, pasando 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")
Si desea un control detallado del color, de modo que la asignación sea "azul oscuro" en 3, "azul" en 2, "azul claro" en 1, "blanco" en 0, etc., entonces scale_fill_gradientn
funcionará 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")
Tienes varias opciones para algo como esto, pero aquí hay una como punto de partida.
Primero, use cut
para crear un factor de Y
con los rangos apropiados:
dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE)
Luego traza usando una paleta de RColorBrewer :
ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y1), colour = "white") +
scale_fill_brewer(palette = "PRGn")
Este esquema de color es más púrpura que azul en el extremo inferior, pero es lo más parecido que pude encontrar entre las paletas de la cerveza.
Si quería construir el suyo, simplemente podría usar scale_fill_manual
y especificar su vector de colores deseado para el argumento de values
.