2012-10-15 19 views
11

O ile mogę powiedzieć facet_wrap wypełnia wiersz. W ten sam sposób można określić, jak wypełnić matrix z byrow Mam nadzieję, że możesz zrobić to samo z facet_wrap. Wiem, że mógłbym zmienić kolejność poziomów czynnika, który będzie działał w tej funkcji, ale wydaje mi się, że to trochę pracy, jeśli istnieje krótsza metoda, którą przeoczyłem.facet_wrap wypełnij przez kolumnę

library(ggplot2) 

ggplot(mtcars, aes(x=gear, y=mpg, fill=vs)) + 
    geom_bar(position="dodge", stat="identity") + 
    facet_wrap(~ carb, ncol=2) #fills by row 

Jak możemy wypełnić kolumną?

+0

Dobre pytanie. Opublikuj jako żądanie funkcji dla Winstona na 'ggplot2' [repo] (https://github.com/hadley/ggplot2/issues?labels=feature&page=1&state=open). :) – Maiasaura

+0

Sporządzono: https://github.com/hadley/ggplot2/issues/695 –

+0

Może dodałem żądanie w niewłaściwym miejscu, ponieważ link nie pasuje do twojego. –

Odpowiedz

4

Można to zrobić, przekształcając zmienną faceted w czynnik, a następnie ponownie ją wyrównując. W funkcji relevel.byrow użyłem matrix(..., byrow=T) do porządkowania poziomów, następnie przekonwertowałem tę macierz na wektor przy użyciu funkcji c(), a następnie ponownie wyrównałem współczynnik.

#number of columns 
nc <- 2 
level.byrow <- function(vec, nc){ 
    fac <- factor(vec) #if it is not a factor 
    mlev <- matrix(levels(fac), nrow=nc, byrow=T) 
    factor(fac, levels= c(mlev)) 
} 

library(plyr) 
ggplot(transform(mtcars, rcarb=level.byrow(carb, nc)), aes(x=gear, y=mpg, fill=vs)) + 
    geom_bar(position="dodge", stat="identity") + 
    facet_wrap(~ rcarb, ncol=nc) 

użyłem plyr dla wygody, można po prostu napisać

mtcars$rcarb <- level.byrow(mtcars$carb, nc) 

Działa to także wtedy, gdy nie mamy pełnej struktury FACET, ale daje kilka ostrzeżeń.

mtcars2 <- subset(mtcars, carb!=3) 
ggplot(transform(mtcars2, rcarb=level.byrow(carb, nc)), aes(x=gear, y=mpg, fill=vs)) + 
    geom_bar(position="dodge", stat="identity") + 
    facet_wrap(~ rcarb, ncol=nc) 

Wynik z carb==3 wykluczone:

enter image description here

+0

Wygląda na to, że opcja kolumny według kolumny nie jest dostępna dla facet_wrap. Rozwiązanie to polega na przegrupowaniu poziomów, dlatego należy utworzyć nową zmienną, aby zachować oryginał. To nie jest idealne, ale myślę, że najlepsze jest teraz. Dziękuję za twoją myśl. –

4

Funkcja ta jest realizowana w obecnej wersji rozwojowej ggplot2 na github. This commit wdraża nowy parametr dir od facet_wrap, więc po prostu chcesz zrobić

## "v" for vertical or "h" for horizontal (the default)  
ggplot(...) + facet_wrap(~ carb, ncol=2, dir="v") 

pamiętać, że ta funkcja nie jest obecnie dostępna w wersji na CRAN.

+0

Jest to obecnie idealne rozwiązanie ze względu na łatwość implementacji. Parametr 'dir' dla' facet_wrap() 'jest teraz częścią wydania CRAN ggplot2. – Megatron