2012-09-21 15 views
13

Sto usando il griglia lpackage a posto i miei grafici che ho fatto con ggplot2:ggplot leggenda separata e la trama

library(ggplot2) 
library(grid) 

Layout <- grid.layout(nrow = 4, ncol = 4, 
      widths = unit(1, "null"), 
      heights = unit(c(0.4, 0.8, 1.2, 1.2), c("null", "null", "null"))) 
grid.show.layout(Layout) 

plot1 = ggplot(diamonds, aes(clarity, fill = color)) + 
      geom_bar() + 
      facet_wrap(~cut, nrow = 1) 
print(plot1 + theme(legend.position = "none"), 
vp = viewport(layout.pos.row = 3, layout.pos.col = 1:4)) 

Il problema è che voglio mettere la trama in terza fila (3,1) - (3,4) e inserire la legenda nella posizione (4,4). Sfortunatamente, non riesco a trovare un modo per creare solo una variabile di legenda. Ho cercato online e il più vicino che ho ottenuto è stato utilizzando il vecchio + opts(keep = "legend_box") ma che è stato deprecato.

older solution.

risposta

24

È possibile ottenere la legenda dall'oggetto grob del ggplot. Quindi è possibile utilizzare la funzione grid.arrange per posizionare tutto.

library(gridExtra) 
g_legend<-function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    legend 
} 

legend <- g_legend(plot1) 

grid.arrange(legend, plot1+ theme(legend.position = 'none'), 
    ncol=2, nrow=1, widths=c(1/6,5/6)) 

Ci sono molti esempi sul web usando la funzione g_legend.

HTH

+0

Grazie per quello. Non ho ancora imparato i nuovi cambiamenti. –

Problemi correlati