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")
Vous devez également spécifier l'esthétique order
.
ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+
geom_bar(stat="identity")
Cela peut être ou non un bug .
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é:
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))
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")
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))