web-dev-qa-db-fra.com

Comment changer l'ordre des étiquettes de facettes dans ggplot (étiquettes d'enveloppe de facettes personnalisées)

J'ai tracé un tracé de facette en utilisant ggplot et voici l'intrigue

http://i.stack.imgur.com/5qXF1.png

Le problème que j'ai est que, les facettes (étiquettes) sont triées par ordre alphabétique (Ex: E1, E10, E11, E13, E2, E3, I1, I10, I2) mais j'ai besoin qu'elles soient un ordre personnalisé comme E1, I1, E2 , I2, E3, E10, I10, E11, E13.

Comment puis je faire ça ?

34
Jana

Ne vous fiez pas à l'ordre par défaut des niveaux imposé par factor() ou en interne par ggplot si la variable de regroupement que vous indiquez est pas un facteur. Définissez les niveaux explicitement vous-même.

dat <- data.frame(x = runif(100), y = runif(100), 
                  Group = gl(5, 20, labels = LETTERS[1:5]))
head(dat)
with(dat, levels(Group))

Et si je les veux dans cet ordre arbitraire?

set.seed(1)
with(dat, sample(levels(Group)))

Pour ce faire, définissez les niveaux comme vous le souhaitez.

set.seed(1) # reset the seed so I get the random order form above
dat <- within(dat, Group <- factor(Group, levels = sample(levels(Group))))
with(dat, levels(Group))

Nous pouvons maintenant utiliser ceci pour que les panneaux soient dessinés dans l'ordre nous voulons:

require(ggplot2)
p <- ggplot(dat, aes(x = x)) + geom_bar()
p + facet_wrap( ~ Group)

Qui produit:

facets wrapped

44
Gavin Simpson

Je travaille juste sur un problème similaire. J'ai des niveaux qui ressemblent à ceci par défaut:

 [1] "A1"  "A10" "A2"  "A3"  "A4"  "A5"  "A6"  "A7"  "A8"  "A9" 
[11] "B1"  "B2"  "B3"  "B4"  "B5"  "B6"  "B7"  "B8"  "B9" 

Notez que le deuxième niveau est déplacé en raison de l'ordre alphabétique.

Voici ce que je fais pour corriger la commande:

reorder(factor(fct),
        fct %>%
          str_replace("([[:alpha:]]+)", "\\1|") %>%
          str_split("\\|") %>%
          sapply(function(d) sprintf("%s%02d", d[1], as.integer(d[2]))),
        function(x) x[1])

Il remplace les niveaux tels que "A1" par "A01", puis les réorganise en fonction de ceux-ci. Je suis sûr que vous pourriez le faire beaucoup plus efficacement, mais cela fait le travail.

Il pourrait être adapté pour résoudre le problème initial.

0
DataWookie