web-dev-qa-db-fra.com

ggplot2 heatmap avec des couleurs pour les valeurs à distance

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

26
MYaseen208

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")

enter image description here

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.

21
joran

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")

enter image description here

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")

43
Brian Diggs