2012-12-13 14 views
8

Co staram się osiągnąć jest o paski zamówione przez daną zmienną na panelu.zmiana kolejności geom_bar przy użyciu facet_wrap

Prosty przykład:

library(ggplot2) 
    library(plyr) 

    df <- data.frame(fac = c("a", "b", "c", "e", "b", "c", "d"),    
        val = c(1, 2, 7, 4, 5, 3, 1), 
        group = c(1, 1, 1, 1, 2, 2, 2)) 

    p1 <- ggplot(df, aes(x = fac, y = val)) + geom_bar() + facet_wrap(~ group, scales = "free") + coord_flip() 
    p1 

    p2 <- ggplot(df, aes(x = reorder(fac, val), y = val)) + geom_bar() + facet_wrap(~ group, scales = "free") + coord_flip() 
    p2 

p2 nie produkuje, co chcę, bo nie każdy „poziom czynnika” pojawia się we wszystkich panelach. Czy istnieje już proste rozwiązanie tego problemu?

Jednym z rozwiązań, które znalazłem jest następujący (oblicza pozycję dla każdego poziomu czynników na grupę).

df2 <- ddply(df, .(group), transform, fac2 = rank(val)) 
df2$fac2 <- factor(df2$fac2) 
p3 <- ggplot(df2, aes(x = fac2, y = val)) + facet_wrap(~ group, scales = "free") + geom_bar(stat = "identity") + coord_flip() + 
    opts(panel.margin = unit(2, "lines")) 
p3 

Muszę ustawić etykiety przez siebie tutaj. Jednym z możliwych rozwiązań jest następujący (zakodowana dla tego przykładu):

grid.newpage() 
grob <- ggplotGrob(p3) 
object.path <- grid.ls(getGrob(grob, "axis.text.y", grep = TRUE, global = TRUE), print = FALSE)$name 
grob <- grid::editGrob(grob, object.path[1], label = c("ABDQ", "M", "A", "B")) 
grob <- grid::editGrob(grob, object.path[2], label = c("A", "B", "EEEEX")) 
grid.draw(grob) 

Ale jest inny problem. Muszę teraz ustawić panel.margin i wydaje mi się, że nie mogę tego zrobić, ponieważ jestem w stanie ustawić tylko "globalny" panel.margin i potrzebuję go dla wszystkich 4 stron (lub najmniej 2).

Pytanie 1: Czy istnieje proste rozwiązanie przy użyciu zmiany kolejności?

Pytanie 2: Czy istnieje rozwiązanie wykorzystujące scale_x_discrete do uzyskania wymaganej osi?

Pytanie 3: Nie udało mi się znaleźć potrzebnego obiektu siatki do manipulowania rzutniami panelu panel.margins. Czy istnieje łatwy sposób manipulowania odpowiednim obiektem siatki?

Wszelkie pomysły?

Odpowiedz

3

myślę że grid.arrange jest znacznie lepszym narzędziem do tego niż próby shoehorn bezpłatne łuski w ramach facetingu:

library(gridExtra) 
q1 <- ggplot(subset(df,group == 1),aes(x = reorder(fac,val),y = val)) + 
     geom_bar() + 
     facet_wrap(~group) + 
     coord_flip() 

q2 <- q1 %+% subset(df,group == 2) 

grid.arrange(q1,q2,nrow = 1) 

enter image description here

+0

Dzięki wielkie! Nie wiedziałem o grid.arrange. – user1901670

Powiązane problemy