2012-09-21 15 views
13

Ich bin mit der Gitter lpackage meine Grafiken zu platzieren, die mich mit ggplot2 gemacht:ggplot getrennte Legende und Grundstück

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

Das Problem ist, dass ich die Handlung auf der dritten Reihe setzen will (3,1) - (3,4) und lege die Legende in die (4,4) Position. Leider kann ich keine Möglichkeit finden, nur eine Legendenvariable zu erstellen. Ich suchte online und die nächste, die ich bekam, war die ältere + opts(keep = "legend_box"), aber das ist veraltet.

older solution.

Antwort

24

Sie können die Legende aus dem Objekt grob des ggplot erhalten. Dann könnten Sie die grid.arrange Funktion verwenden, um alles zu positionieren.

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

Es gibt viele Beispiele, die im Internet die g_legend Funktion.

HTH

+0

Danke dafür. Ich bin immer noch nicht zu den neuen Änderungen gekommen. –

Verwandte Themen