76 votes

ggplot2 ordre inverse de scale_brewer

Une chose apparemment très simple à faire mais qui m'a pris >30min sans trouver de réponse.

Comment inverser l'ordre des couleurs ? En regardant documentation pour scale_brewer je me suis dit que c'était possible formatter= l'argument étant suspicieux. J'ai passé 'rev' et ensuite rev mais ils n'ont aucun effet (pas de message d'erreur, juste ignorés).

4 votes

Réponse de pbaylis (set direction=-1 ) semble être la réponse la plus simple à la question du titre, mais celles de Joran ou de Josh donnent plus de contrôle, par exemple en passant une séquence arbitraire de couleurs, et pas seulement la séquence inverse.

82voto

pbaylis Points 899

La version CRAN de ggplot2 permet maintenant aux utilisateurs de spécifier direction=-1 en brasseur d'écailles pour inverser les couleurs. Ce qui suit produit le même tracé que la réponse acceptée.

ggplot(mtcars,aes(x = mpg, y = disp)) + 
  geom_point(aes(colour = factor(cyl))) + 
  scale_colour_brewer(palette="BuPu", direction=-1)

0 votes

En haut ! Plus direct que ne le font les rev(...)

0 votes

Ça n'a pas marché pour moi. Je ne sais pas trop pourquoi. Est-ce parce que j'utilise un Mac ?

0 votes

J'ai R v3.6.1, ggplot2 v3.2.1, RColorBrewer v1.1.2 sur MacOS Mojave v10.14.6 et cela fonctionne parfaitement !

64voto

joran Points 68079

Je pense que vous voulez probablement sélectionner les couleurs en utilisant brewer.pal directement et ensuite utiliser scale_colour_manual :

library(ggplot2)
library(RColorBrewer)

ggplot(mtcars,aes(x = mpg, y = disp)) + 
    geom_point(aes(colour = factor(cyl))) + 
    scale_colour_manual(values = rev(brewer.pal(3, "BuPu")))

Alors vous pouvez rev l'ordre des couleurs là-bas.

À partir de la version 2.0.0 de ggplot, il existe maintenant une façon plus directe de le faire, voir la réponse de @pbaylis ci-dessous.

2 votes

+1 -- C'est bien. Il pourrait également être bon de "câbler" le nombre de couleurs nécessaires, comme ceci : rev(brewer.pal(n=length(unique(mtcars$cyl)), "BuPu")) .

0 votes

...ou scale_fill_manual quel que soit le paradigme le plus approprié pour votre géomètre.

0 votes

N'hésitez pas à mettre à jour votre réponse avec le code que j'ai posté et je retirerai le mien pour plus de clarté.

30voto

Antoine Lizée Points 662

Cela n'aidera pas à résoudre le problème de l'OP - je le sais. Pour les échelles discrètes comme scale_..._brewer() en faisant scale_..._manual(values = rev(colorsYouHad)) est la bonne réponse.

Néanmoins, pour en continu les échelles, vous pouvez simplement passer :

scale_..._...(..., trans = "reverse")

par exemple, pour l'équivalent continu de scale_..._brewer() :

scale_..._distiller("My Scale", palette = "Spectral", trans = "reverse")

0 votes

J'apprécie le désir d'alerter les utilisateurs sur un moyen plus simple de faire la même chose, mais puisque les deux réponses faire travail, une modification appelant une réponse différente la "bonne" réponse est inappropriée. Je suis assez réactif aux commentaires sur mes réponses. Un simple commentaire me disant que ma réponse est périmée est suffisant.

0 votes

C'est une réponse simple et agréable, qui a fonctionné pour moi, merci !

2 votes

Notez que lorsque vous utilisez trans = "reverse" L'ordre des valeurs change également. Pour les échelles continues, cela signifie que les valeurs de la légende seront diminuer vers le haut

11voto

Josh O'Brien Points 68397

Si vous ne voulez pas vous battre directement avec RColorBrewer (un beau paquet), vous pouvez inverser les niveaux du facteur dans le data.frame original, puis le tracer :

dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

# Reverse the levels of the factor associated with color, here 'clarity'
# (Might be safer to assign this to a new column named, e.g., 'clarity2')
levels(dsamp$clarity) <- rev(levels(dsamp$clarity))

d <- qplot(carat, price, data = dsamp, colour = clarity)
d + scale_colour_brewer(breaks = levels(dsamp$clarity))

Et si vous voulez imprimer la clé dans le même ordre qu'avant le renversement, il suffit de faire ceci :

d + scale_colour_brewer(breaks = rev(levels(dsamp$clarity)))

4voto

dj20b22 Points 73

Je sais, je suis très en retard pour la fête. Mais j'ai rencontré ce problème il y a quelque temps et j'ai utilisé la solution ci-dessus. Je suis actuellement en train de lire r4ds de Hadley Wickham et il y a une solution ridiculement facile, alors j'ai pensé la poster. Changez ça :

ggplot(mtcars,aes(x = mpg, y = disp)) + 
geom_point(aes(colour = factor(cyl)))

à ça :

ggplot(mtcars,aes(x = mpg, y = disp)) + 
geom_point(aes(colour = factor(-cyl))) #note the minus symbol

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X