2013-08-05 7 views
5

Sto cercando di capovolgere le etichette su un pannello sfaccettato di 1 riga e 5 colonne, in modo che le intestazioni delle faccette appaiano sul fondo e l'asse x appaia sopra le faccette.Etichetta flip facet e asse x con ggplot2

La ragione è che voglio riutilizzare quelle intestazioni per una tabella che sarà direttamente sotto il grafico.

Quindi in questo esempio ...

library(ggplot2) 

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

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

vorrei il "taglio" etichette di presentarsi sotto il grafico. Stavo pensando che facet_grid potrebbe contenere la chiave, ma è solo un'ipotesi.

Qualcuno sa come realizzare questo?

+1

Non sono a conoscenza della risposta a questa domanda che è cambiata da [questo] (http://stackoverflow.com/q/3261597/324364) o [t suo] (http://stackoverflow.com/q/10058839/324364). – joran

+0

Sembra brutta notizia ... Probabilmente fuori tema, ma mi chiedo se reticolo offre questa funzionalità. – wesmantooth

risposta

7

Come le strisce sfaccettatura sotto la trama è facile,

library(gtable) 
g <- ggplotGrob(p) 

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

assi, tuttavia, richiedono più attenzione perché si deve invertire la posizione dei segni di graduazione ed etichette. È forse può iniziare con questo,

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) 

Edit: in base a quanto sopra, una soluzione "completa" potrebbe essere

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

(con ovvie cautele)

+1

kohske ha pubblicato alcuni trucchi per gli assi: http://rpubs.com/kohske/dual_axis_in_ggplot2 – baptiste

+0

Se uso '" strip_t "' e poi eseguo 'strips' ottengo l'output' TableGrob (6 x 5) "layout": 0 ghiottoni'. È questo l'effetto previsto? Chiedo perché ho anche un errore sull'output finale, 'Errore in mmm wesmantooth

+1

dovresti avere 5 grobs in quel gtable, assicurati che 'p' sia il tuo grafico aggiornato per includere la seconda riga (' facet_wrap'). Ho aggiornato il codice per occuparmi dell'altro errore. – baptiste