2011-03-30 12 views
32

Ciao ho tracciato una trama aspetto utilizzando ggplot in R e qui è la tramaCome cambiare l'ordine delle etichette sfaccettatura in ggplot (etichette personalizzate avvolgere listello)

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

Il problema che ho è, Il le faccette (etichette) sono ordinate alfabeticamente (Es: E1, E10, E11, E13, E2, E3, I1, I10, I2) ma ho bisogno che siano un ordine personalizzato come E1, I1, E2, I2, E3, E10, I10, E11, E13.

Come posso farlo?

+5

Riorganizzare l'ordine del fattore sottostante. Puoi usare 'relevel()' o 'riordino()' o creare un ordine personalizzato e usare 'factor()'. – Chase

risposta

40

non si basano su l'ordinamento di default dei livelli imposti dalla factor() o internamente dal ggplot se la variabile di raggruppamento fornite è non un fattore. Imposta i livelli in modo esplicito.

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

E se li voglio in questo ordine arbitrario?

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

Per fare ciò, impostare i livelli nel modo desiderato.

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)) 

Ora possiamo usare questo per avere i pannelli disegnati nell'ordine abbiamo mancanza:

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

che produce:

facets wrapped

+1

Grazie mille gavin :) – Jana

0

Basta essere lavorando su un simile problema. Ho livelli che simile a questa di default:

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

Nota che il secondo livello è fuori luogo a causa di ordine alfabetico.

Questo è quello che sto facendo per risolvere l'ordine:

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]) 

Esso sostituisce i livelli come "A1" con "A01", quindi riordina in base a questi. Sono sicuro che potresti farlo molto più efficacemente, ma fa il lavoro.

Potrebbe essere adattato per risolvere il problema originale.

Problemi correlati