Quello che cerco di ottenere è avere le barre ordinate da una variabile data per pannello.riordino di geom_bar quando si utilizza facet_wrap
Un semplice esempio:
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 non produce quello che voglio perché non ogni "livello di fattore" appare in tutti i pannelli. C'è già una soluzione semplice per questo problema?
Una soluzione che ho trovato è la seguente (calcola la classifica per ogni livello di fattore per gruppo).
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
Devo impostare le etichette da solo qui. Una possibile soluzione è la seguente (hardcoded per questo esempio):
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)
Ma c'è un altro problema. Ora devo impostare il pannello su se stesso e sembra che non sia possibile farlo poiché sono solo in grado di impostare un pannello "globale". Quello che mi serve è uno per tutti e 4 i lati (o almeno 2).
Domanda 1: Esiste una soluzione semplice utilizzando il riordino?
Domanda 2: Esiste una soluzione che utilizza scale_x_discrete per ottenere l'asse necessario?
Domanda 3: Non è stato possibile trovare l'oggetto griglia necessario per manipolare le finestre per il pannello.margins. C'è un modo semplice per manipolare l'oggetto griglia appropriato?
Qualche idea?
Grazie mille! Non ero a conoscenza di grid.arrange. – user1901670