2012-09-21 12 views
13

estoy usando el rejilla lpackage colocar mis gráficos que hice con ggplot2:ggplot leyenda separada y 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)) 

El problema es que quiero poner la trama en la tercera fila (3,1) - (3,4) y coloque la leyenda en la posición (4,4). Lamentablemente, no puedo encontrar una manera de crear solo una variable de leyenda. Realicé búsquedas en línea y lo más cercano que obtuve fue usando el anterior + opts(keep = "legend_box"), pero eso ha quedado obsoleto.

older solution.

Respuesta

24

Puede obtener la leyenda del objeto grob del ggplot. Entonces podría usar la función grid.arrange para posicionar todo.

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)) 

Hay muchos ejemplos en la web usando la función g_legend.

HTH

+0

Gracias por eso. Todavía no he llegado a los nuevos cambios. –

Cuestiones relacionadas