ggplot legenda e enredo separados

Eu estou usando o gridpack para colocar meus charts que fiz com o ggplot2 :

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

O problema é que eu quero colocar o gráfico na terceira linha (3,1) – (3,4) e colocar a legenda na posição (4,4). Infelizmente, não consigo encontrar uma maneira de criar apenas uma variável de legenda. Eu procurei on-line e o mais próximo que eu cheguei foi usando o antigo + opts(keep = "legend_box") mas que foi preterido.

solução mais antiga .

Você pode obter a legenda do object grob do ggplot. Então você poderia usar a function grid.arrange para posicionar tudo.

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

Existem muitos exemplos na Web usando a function g_legend .

HTH

Existe uma function grid_arrange_shared_legend sugerida pelos próprios desenvolvedores do ggplot2: https://github.com/hadley/ggplot2/wiki/Share-a-legend-between-two-ggplot2-graphs , que funciona muito bem.