web-dev-qa-db-fra.com

ggplot geom_point () avec des couleurs basées sur des valeurs discrètes spécifiques

J'essaie de tracer des points de données avec trois couleurs différentes pour trois plages de valeurs. Par exemple:

library(ggplot2)
ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(colour = qsec))

Ce qui précède produit:

enter image description here

Maintenant, je voudrais modifier ceci pour que les valeurs qseq <17 soient noires, les valeurs entre 17 et 19 soient jaunes et les valeurs supérieures à 19 soient rouges. J'ai essayé différentes approches, mais aucune ne semble fonctionner:

  • Extrait de ici

    ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(fill = qsec)) + 
    scale_fill_gradientn(colours=c("black","yellow","red"), 
    breaks=c(0,17,19), labels=format(c("0","17","19")))
    

    Cela produit:

    enter image description here

    Ainsi, la barre de couleurs semble correcte mais les couleurs ne sont pas réellement appliquées.

  • Les solutions données dans carte thermique ggplot2 avec des couleurs pour les valeurs à distance semblent prometteuses mais je ne peux pas les faire fonctionner avec geom_point().

  • Il en va de même pour divers articles similaires, tels que ceux répertoriés dans la barre latérale.

Je me rends compte que je devrai probablement utiliser une sorte d'échelle discrète au lieu de scale_fill_gradientn Mais mes tentatives d'utilisation de scale_color_manual() échouent:

ggplot(mtcars, aes(wt, mpg)) + geom_point(aes(color = factor(qsec))) + 
scale_color_manual(values=c("black", "yellow","red")
Error: Insufficient values in manual scale. 30 needed but only 4 provided.

Je suppose que je devrai en quelque sorte utiliser cut() ou factor() mais je n'arrive pas à comprendre comment. Aucune suggestion?

19
terdon

Vous devez cut vos valeurs en intervalles:

library(ggplot2)
ggplot(mtcars, aes(wt, mpg)) + 
  geom_point(aes(colour = cut(qsec, c(-Inf, 17, 19, Inf))),
             size = 5) +
  scale_color_manual(name = "qsec",
                     values = c("(-Inf,17]" = "black",
                                  "(17,19]" = "yellow",
                                  "(19, Inf]" = "red"),
                     labels = c("<= 17", "17 < qsec <= 19", "> 19"))

resulting plot

29
Roland