Je veux faire une carte thermique dans ggplot2. Mes données et code de jouet sont:
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
Je veux avoir un jeu de couleurs pour les valeurs à distance comme ceci:
-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
Toute aide sera grandement appréciée. Merci
Vous avez plusieurs options pour quelque chose comme ça, mais en voici une comme point de départ.
Tout d'abord, utilisez cut
pour créer un facteur à partir de Y
avec les plages appropriées:
dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE)
Tracez ensuite en utilisant une palette de RColorBrewer:
ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y1), colour = "white") +
scale_fill_brewer(palette = "PRGn")
Ce schéma de couleurs est plus violet que bleu sur le bas de gamme, mais c'est le plus proche que je puisse trouver parmi la palette de brasseur.
Si vous souhaitez créer le vôtre, vous pouvez simplement utiliser scale_fill_manual
et spécifiez le vecteur de couleurs souhaité pour l'argument values
.
Il n'est pas clair si vous voulez des couleurs discrètes ou si les couleurs que vous listez ne sont que des marqueurs le long de la plage de Y
. Je vais montrer les deux.
Pour les couleurs discrètes, utilisez Y1
comme joran le définit
dat$Y1 <- cut(dat$Y,breaks = c(-Inf,-3:3,Inf),right = FALSE)
Ensuite, vous pouvez obtenir un tracé avec les couleurs spécifiques que vous listez en utilisant une échelle manuelle
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
Je ne savais pas ce que vous vouliez pour des couleurs au-delà de -3 et 3, j'ai donc utilisé du blanc.
Si vous vouliez une couleur continue, allant du bleu sur le négatif au blanc à 0 au vert sur le positif, scale_fill_gradient2
travaillerait.
ggplot(data = dat, aes(x = Row, y = Col)) +
geom_tile(aes(fill = Y)) +
scale_fill_gradient2(low="darkblue", high="darkgreen", guide="colorbar")
Si vous voulez un contrôle détaillé des couleurs, tel que le mappage est "bleu foncé" à 3, "bleu" à 2, "bleu clair" à 1, "blanc" à 0, etc., puis scale_fill_gradientn
fonctionnera pour vous:
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")