web-dev-qa-db-fra.com

Comment commandez-vous les couleurs de remplissage dans ggplot2 geom_bar

J'appelle la fonction ggplot

ggplot(data,aes(x,y,fill=category)+geom_bar(stat="identity")

Le résultat est un graphique à barres avec des barres remplies de différentes couleurs correspondant à la catégorie. Cependant, l'ordre des couleurs n'est pas cohérent d'une barre à l'autre. Disons qu'il y a du rose, du vert et du bleu. Certaines barres deviennent roses, vertes, bleues de bas en haut et certaines deviennent vertes, roses, bleues. Je ne vois aucun schéma évident.

Comment ces commandes sont-elles choisies? Comment puis-je le changer? À tout le moins, comment puis-je faire en sorte que ggplot choisisse une commande cohérente?

Les classes de (x, y et catégorie) sont respectivement (entier, numérique et facteur). Si je fais de la catégorie un facteur ordonné, cela ne change pas ce comportement.

Quelqu'un sait comment réparer ceci?

Exemple reproductible:

dput(data)

structure(list(mon = c(9L, 10L, 11L, 10L, 8L, 7L, 7L, 11L, 9L, 
10L, 12L, 11L, 7L, 12L, 8L, 12L, 9L, 7L, 9L, 10L, 10L, 8L, 12L, 
7L, 11L, 10L, 8L, 7L, 11L, 12L, 12L, 9L, 9L, 7L, 7L, 12L, 12L, 
9L, 9L, 8L), gclass = structure(c(9L, 1L, 8L, 6L, 4L, 4L, 3L, 
6L, 2L, 4L, 1L, 1L, 5L, 7L, 1L, 6L, 8L, 6L, 4L, 7L, 8L, 7L, 9L, 
8L, 3L, 5L, 9L, 2L, 7L, 3L, 5L, 5L, 7L, 7L, 9L, 2L, 4L, 1L, 3L, 
8L), .Label = c("Down-Down", "Down-Stable", "Down-Up", "Stable-Down", 
"Stable-Stable", "Stable-Up", "Up-Down", "Up-Stable", "Up-Up"
), class = c("ordered", "factor")), NG = c(222614.67, 9998.17, 
351162.2, 37357.95, 4140.48, 1878.57, 553.86, 40012.25, 766.52, 
15733.36, 90676.2, 45000.29, 0, 375699.84, 2424.21, 93094.21, 
120547.69, 291.33, 1536.38, 167352.21, 160347.01, 26851.47, 725689.06, 
4500.55, 10644.54, 75132.98, 42676.41, 267.65, 392277.64, 33854.26, 
384754.67, 7195.93, 88974.2, 20665.79, 7185.69, 45059.64, 60576.96, 
3564.53, 1262.39, 9394.15)), .Names = c("mon", "gclass", "NG"
), row.names = c(NA, -40L), class = "data.frame") 

ggplot(data,aes(mon,NG,fill=gclass))+geom_bar(stat="identity")
36
Dave31415

Vous devez également spécifier l'esthétique order.

ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+
    geom_bar(stat="identity")

enter image description here

Cela peut être ou non un bug .

23
Brian Diggs

Depuis ggplot2_2.0.0, l'esthétique order n'est plus disponible. Pour obtenir un graphique avec les piles ordonnées par couleur de remplissage, vous pouvez simplement classer l'ensemble de données par la variable de regroupement que vous souhaitez classer.

J'utilise souvent arrange de dplyr pour cela. Ici, je commande l'ensemble de données par le facteur fill dans l'appel ggplot plutôt que de créer un ensemble de données ordonné, mais les deux fonctionnent correctement.

library(dplyr)

ggplot(arrange(data, gclass), aes(mon, NG, fill = gclass)) +
    geom_bar(stat = "identity")

Cela se fait facilement en base R, bien sûr, en utilisant le classique order avec les crochets d'extraction:

ggplot(data[order(data$gclass), ], aes(mon, NG, fill = gclass)) +
    geom_bar(stat = "identity")

Avec le tracé résultant dans les deux cas maintenant dans l'ordre souhaité: enter image description here

Mise à jour ggplot2_2.2.0

Dans ggplot_2.2.0, l'ordre de remplissage est basé sur l'ordre des niveaux de facteur. L'ordre par défaut tracera le premier niveau au en haut de la pile au lieu du bas.

Si vous voulez le premier niveau au bas de la pile, vous pouvez utiliser reverse = TRUE Dans position_stack. Notez que vous pouvez également utiliser geom_col Comme raccourci pour geom_bar(stat = "identity").

ggplot(data, aes(mon, NG, fill = gclass)) +
    geom_col(position = position_stack(reverse = TRUE))
49
aosmith

Pour commander, vous devez utiliser le paramètre levels et renseigner la commande. Comme ça:

data$gclass
(data$gclass2 <- factor(data$gclass,levels=sample(levels(data$gclass)))) # Look the difference in the factors order
ggplot(data,aes(mon,NG,fill=gclass2))+geom_bar(stat="identity")
5
Rcoster

Vous pouvez changer la couleur en utilisant le scale_fill_ les fonctions. Par exemple:

ggplot(dd,aes(mon,NG,fill=gclass)) + 
  geom_bar(stat="identity") + 
  scale_fill_brewer(palette="blues")

Pour obtenir un ordre cohérent dans le bars, vous devez alors commander le bloc de données:

dd = dd[with(dd, order(gclass, -NG)), ]

Afin de changer l'ordre des légendes, modifiez le facteur gclass. Donc quelque chose comme:

dd$gclass= factor(dd$gclass,levels=sort(levels(dd$gclass), TRUE))

enter image description here

4
csgillespie