2011-03-30 3 views
32

Witam kreślonych działkę FACET korzystając ggplot w badania i tutaj jest działkaJak zmienić kolejność etykiet facet w ggplot (custom aspekt etykiet oblewania)

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

Mam problem, tym fasety (etykiety) są posortowane alfabetycznie (np. E1, E10, E11, E13, E2, E3, I1, I10, I2), ale potrzebuję, aby były to niestandardowe zlecenia, takie jak E1, I1, E2, I2, E3, E10, I10, E11, E13.

Jak mogę to zrobić?

+5

Zmień kolejność pierwotnego czynnika. Możesz użyć 'relevel()' lub 'reorder()' lub utwórz niestandardową kolejność i użyj 'factor()'. – Chase

Odpowiedz

40

nie należy polegać na domyślnej kolejności poziomów nałożonych przez factor() lub wewnętrznie przez ggplot jeśli grupowanie podać zmienną jest nie czynnikiem. Samodzielnie ustaw poziomy samodzielnie.

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

Co jeśli chcę je w tym arbitralnym porządku?

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

Aby to zrobić, ustaw poziomy tak, jak chcesz.

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

Teraz możemy to wykorzystać, aby mieć panele narysowane w kolejności my Kupię:

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

która produkuje:

facets wrapped

+1

Wielkie dzięki Gavin :) – Jana

0

Tylko będąc pracy na podobnym problem. Mam poziomy, które domyślnie wyglądają tak:

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

Pamiętaj, że drugi poziom jest nie na miejscu ze względu na kolejność alfabetyczną.

To, co robię, aby ustalić kolejność:

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

Zastępuje poziom jak „A1” z „A01”, a następnie zmienia kolejność według nich. Jestem pewien, że możesz to zrobić dużo wydajniej, ale to się sprawdza.

Można go dostosować do pierwotnego problemu.