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?
Dzięki wielkie! Nie wiedziałem o grid.arrange. – user1901670