2017-09-29 3 views
2

Ich versuche, ein Multi-Panel-Diagramm mit ggplot2 zu erstellen (mit grid.extra und egg Pakete). Zwei der Parzellen sind Boxplots und die dritte verwendet geom_count. Wie:Probleme mit Legendenvergrößerung mit grid.arrange und ggplot

f <- ggplot(mpg, aes(drv, cty)) + geom_boxplot() 

f2 <- ggplot(mpg, aes(drv, hwy)) + geom_boxplot() 

f3 <- ggplot(mpg, aes(drv, class)) + 
     geom_count() + scale_size_area(max_size = 15) 

Wenn ich versuche, sie zu arrangieren mit:

b <- grid.arrange(grobs = lapply(
    list(f, f2, f3), 
    set_panel_size, 
    width = unit(2, "in"), 
    height = unit(2, "in") 
), ncol=3) 

Die Legende für die 3. Grundstück (das germ_count Grundstück) endet so groß wie die Handlung selbst (und viel größer als bei f3 ist für sich selbst gezeichnet). Weitere, wenn ich die Datei speichern mit:

ggsave(filename = dumb.tif, plot = b, width = 7.25, height = 4) 

Die Plots in einer Art und Weise überlappend am Ende, die überhaupt nicht schauen, wie sie in der RStudio Plotfenster tun.

Antwort

2

Zuerst wird Ihre Legendengröße durch die Punktgröße von geom_count bestimmt, und diese Punktgrößen sind absolut. Mit einem kleinen (2 "Plot) wird Ihre Legende also ziemlich groß. Sie können dies beheben, indem Sie max_size in scale_size_area anpassen, oder einfach Ihre Plot größer machen, um die relative Plotgröße kleiner zu machen.

Zweitens, set_panel_size setzt die Panel (Plot Bereich) Größen, aber Ihre tatsächlichen Plots sind größer, wenn Sie Achsen, Text, Legende, etc. Also 2 "Panels führen zu überlappenden Plots, wenn Sie versuchen, sie zu einem 7,25" Wide Area Auch f3, mit einem 2 "Panel, wird breiter sein, weil es eine Legende enthält. Aber Ihre grid.arrange Aufruf standardmäßig alle Plots die gleiche Breite machen, wenn Sie ncol = 3 verwenden. Sie müssen widths verwenden, um die Spalten unterschiedlich breit zu machen.

Dass sie alle zusammen:

library(ggplot2) 
library(grid.extra) 
library(egg) 

f <- ggplot(mpg, aes(drv, cty)) + geom_boxplot() 

f2 <- ggplot(mpg, aes(drv, hwy)) + geom_boxplot() 

f3 <- ggplot(mpg, aes(drv, class)) + 
    geom_count() + scale_size_area(max_size = 15) 

b <- grid.arrange(grobs = lapply(
    list(f, f2, f3), 
    set_panel_size, 
    width = unit(3, "in"), 
    height = unit(3, "in") 
), widths =c(2,2,3), ncol=3) 

ggsave(filename = "dumb.png", plot = b, width = 12, height = 4) 

enter image description here

+0

Wenn Sie wirklich möchten, dass die Legende eine andere absolute Größe als die Punkte in der Zeichnung hat, können Sie 'cowplot :: get_legend' verwenden, um sie zu erfassen und als separates Plot-Objekt zu verwalten. Beispiel hier: https://cran.r-project.org/web/packages/cowplot/vignettes/shared_legends.html –

+0

Danke! Ich wähle diese Antwort, da sie genügend Informationen liefert, um allgemeiner zu sein, aber die Vorschläge von @baptiste funktionieren auch. Danke euch beiden –

-1

versuchen, es auf diese Weise:

combined_plot <- arrangeGrob(p1, p2, p3, widths = c(2,2,3), heights = c(2,2,2), ncol = 3)

ggsave(filename = combined.png, plot = combined_plot, width = 7.25, height = 4)

arrange.grob() keine Objektzuordnung macht. arrangeGrob() tut, so können Sie ggsave() das Ausgabeobjekt. Keine Notwendigkeit für . widths werden als Vektor und nicht als Gesamtbreite angegeben. Stellen Sie sich eine Reihe von proportionalen Breiten vor. Die Gesamtbreite/-höhe kann mit ggsave() eingestellt werden.

+0

i) grid.arrange nicht arrange.grob; ii) Gitter.arrange() gibt ein Objekt zurück; iii) Ihr Code erzeugt ein 3x3-Layout mit 2 leeren Zeilen; iv) Breiten können absolut sein. – baptiste

2

egg::ggarrange() hat derzeit Probleme mit Breiten und Höhen (Aufsicht, die ich getestet nur den Fall von relativen Breiten/Höhen und Rastereinheiten mir immer Trick einen Weg oder ein anderes). Mit der Entwickler-Version die Sie tun können,

library(egg) 
g <- ggarrange(f, f2, f3, nrow=1, 
       widths = rep(unit(2,"in"), 3), 
       heights = unit(2,"in")) 

margin <- unit(1,"line") 
ggsave('dumb.pdf', plot=g, 
     width = grid::convertWidth(sum(g$widths) + margin, 
            unitTo = "in", valueOnly = TRUE), 
     height = grid::convertHeight(sum(g$heights) + margin, 
            unitTo = "in", valueOnly = TRUE)) 

enter image description here

Die Größe der Legende ist absolut; das ist eine Designauswahl in ggplot2. Sie können einige Parameter im Theme ändern, um den Abstand und einige Ränder zu verkleinern.

Verwandte Themen