2013-08-05 6 views
5

Ich möchte die Beschriftungen auf einem facettierten Panel mit 1 Reihe und 5 Spalten spiegeln, so dass die Facettenköpfe unten erscheinen und die x-Achse oben auf den Facetten erscheint.Facettenetikett und x-Achse mit ggplot2 spiegeln

Der Grund ist, dass ich diese Header für eine Tabelle, die direkt unter dem Diagramm sein wird, wiederverwenden möchte.

in diesem Beispiel also ...

library(ggplot2) 

my.hist<-ggplot(diamonds, aes(clarity)) + geom_bar() 

my.hist + facet_wrap(~ cut, ncol=5) + coord_flip() 

Ich würde wollen, dass die "cut" Etiketten unter dem Diagramm zu zeigen. Ich dachte, dass facet_grid den Schlüssel halten könnte, aber ist nur eine Vermutung.

Wer weiß, wie man das erreicht?

+1

Mir ist nicht bekannt, dass sich die Antwort auf diese Frage seit [this] (http://stackoverflow.com/q/3261597/324364) oder [t sein] (http://stackoverflow.com/q/10058839/324364). – joran

+0

Sieht aus wie schlechte Nachrichten ... Wahrscheinlich aus dem Thema, aber ich frage mich, ob Gitter diese Funktionalität bietet. – wesmantooth

Antwort

7

Getting die Facette Streifen unterhalb der Plot einfach,

library(gtable) 
g <- ggplotGrob(p) 

strips <- gtable_filter(g, "strip_t", trim=FALSE) 
grid.newpage() 
grid.draw(rbind(g, strips[3,], size="first")) 

die Achsen erfordern jedoch mehr Sorgfalt, weil man die Position der Markierungen und Etiketten umgekehrt hat. basierend auf dem oben eine "vollständige" Lösung könnte sein

grid.newpage() 
g2 <- g 
new_axes <- lapply(g2$grobs[grepl("axis_b", g2$layout$name)], tweak_axis) 
g$grobs[grepl("strip_t", g$layout$name)] <- new_axes 
g$grobs[grepl("axis_b", g$layout$name)] <- g2$grobs[grepl("strip_t", g2$layout$name)] 
# heights should be changed too, but it's kind of ok here 
xlab <- 7; title <- 1:2 
grid.draw(rbind(g[xlab,], g[-c(title, xlab), ], size="last")) 

enter image description here

(mit offensichtlichen Einschränkungen)

: Sie können vielleicht mit diesem,

tweak_axis <- function(a){ 
    inner <- a[["children"]]["axis"][[1]] 
    inner[["grobs"]] <- rev(inner[["grobs"]]) 
    inner$grobs[[2]]$y <- inner$grobs[[2]]$y - unit(0.15, "cm") 
    a[["children"]]["axis"][[1]] <- inner 
    a 
} 

axes <- gtable_filter(g, "axis_b", trim=FALSE) 
axes$grobs <- lapply(axes$grobs, tweak_axis) 
grid.newpage() 
grid.draw(axes) 

bearbeiten starten

+1

kohske hat einige Tricks für die Achsen veröffentlicht: http://rpubs.com/kohske/dual_axis_in_ggplot2 – baptiste

+0

Wenn ich '" strip_t "' benutze und dann 'strips' starte bekomme ich die Ausgabe' TableGrob (6 x 5) "Layout": 0 Grob's. Ist das der beabsichtigte Effekt? Ich frage, weil ich auch einen Fehler auf der endgültigen Ausgabe bekomme, 'Fehler in mmm wesmantooth

+1

Sie sollten 5 Grobs in diesem Gtable haben, stellen Sie sicher, 'p' ist Ihr Grundstück aktualisiert, um die zweite Zeile (' facet_wrap') aufzunehmen. Ich habe den Code aktualisiert, um den anderen Fehler zu beheben. – baptiste