Wie ordne ich mit grid.arrange eine variable Liste von Plots an?

92
library(ggplot2)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)
# In my real example,a plot function will fit a ggplot to a list of datasets 
#and return a list of ggplots like the example above.

Ich möchte die Handlungen mit grid.arrange()in arrangieren gridExtra.

Wie würde ich das tun, wenn die Anzahl der Diagramme plistvariabel ist?

Das funktioniert: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

aber ich brauche eine allgemeinere Lösung. Gedanken?

Maiasaura
quelle

Antworten:

136

Wie wäre es damit:

library(gridExtra)
n <- length(plist)
nCol <- floor(sqrt(n))
do.call("grid.arrange", c(plist, ncol=nCol))

Geben Sie hier die Bildbeschreibung ein

Josh O'Brien
quelle
Das ist schön, außer dass die Funktion keine NULL-Objekte verarbeiten kann.
Roman Luštrik
Josh. Ich liebe dich. Habe bis jetzt 2 Stunden damit verbracht. Möchten Sie erklären, warum dies nicht funktioniert? grid.arrange(plist[[1:length(plist)]], ncol = nCol))Ich erhalte die folgende Fehlermeldung: Error in hl.plots[[1:12]] : no such index at level 3Danke!
Anto
2
@Anto An diesem Code scheinen mehrere Dinge falsch zu sein, aber derjenige, der Ihnen den angezeigten Fehler gibt, wird wahrscheinlich durch dieselbe Art von Fehler verursacht, wie hier gezeigt : x <- list(1,2); x[[3:1]]. Verwenden Sie im weiteren Sinne plist[...]eher etwas als plist[[...]]Ihre Teilmenge. Und dann verwenden Sie do.call(), was wir verwenden müssen, weil grid.arrange()es nicht so eingerichtet ist, dass eine Liste als erstes Argument verwendet wird. Prost und viel Glück!
Josh O'Brien
31

Sie können grid.arrange()und arrangeGrob()mit Listen verwenden, solange Sie die Liste mit dem grobs =Argument in jeder Funktion angeben . ZB in dem Beispiel, das Sie gegeben haben:

library(ggplot2)
library(gridExtra)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

grid.arrange(grobs = plist, ncol = 2) ## display plot
ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2))  ## save plot
Michael Ohlrogge
quelle
1
Ich habe viel zu lange gebraucht, um diese Antwort zu finden ... danke! Das ist das einfachste.
Matt L.
16

Der Vollständigkeit halber (und da diese alte, bereits beantwortete Frage kürzlich wiederbelebt wurde ) möchte ich mithilfe des cowplotPakets eine Lösung hinzufügen :

cowplot::plot_grid(plotlist = plist, ncol = 2)

Geben Sie hier die Bildbeschreibung ein

Uwe
quelle
Jede Idee, warum das Übergeben einer Liste von Plots mit diesem Code diesen Fehler zurückgibt: Error in ggplot_to_gtable(x) : Argument needs to be of class "ggplot" or "gtable"
geog_newbie
Wie wurden die Parzellen erstellt? Verwenden Sie das ggplot2Paket oder die Basisgrafiken?
Uwe
ggplot2. grid.arrangeIch habe fast für mich gearbeitet - aber es stellt sich heraus, dass meine Liste der Grundstücke nicht gefüllt wird. Ich habe das Problem als Frage gestellt: stackoverflow.com/questions/43216262/… . Also frage ich mich, ob das auch das Problem für Cowplot gewesen sein könnte
geog_newbie
10

Ich weiß, dass die Frage speziell die Verwendung des gridExtra- Pakets angibt , aber die wrap_plotsFunktion aus dem Patchwork- Paket ist eine großartige Möglichkeit, Listen mit variabler Länge zu verarbeiten:

library(ggplot2)
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

wrap_plots(plist)

Geben Sie hier die Bildbeschreibung ein

Eine nützliche Sache dabei ist, dass Sie nicht angeben müssen, wie viele Spalten erforderlich sind, und dass die Anzahl der Spalten und Zeilen gleich bleiben soll. Beispielsweise:

plist <- list(p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1,p1)
wrap_plots(plist) # produces a 4 col x 4 row plot

Weitere Informationen zum Patchwork- Paket finden Sie hier

Michael Harper
quelle
Ich kann nicht scheinen, das Paket zu installieren, das Sie hier erwähnt haben
baxx
Haben Sie versucht, die oben devtools::install_github("thomasp85/patchwork")auskommentierte Installationszeile auszuführen ?
Michael Harper
Danke, habe ich nicht. Ich habe gerade versucht, die Installation von RStudio zu verwenden.
Baxx
1
Das Paket ist noch nicht auf CRAN verfügbar, daher müssen Sie es über GitHub installieren. Hoffentlich ist dies nicht mehr lange der Fall, da es sich um ein ausgezeichnetes Paket handelt!
Michael Harper
1

Um alle Diagramme auf einer Seite unterzubringen, können Sie die Anzahl der Spalten und Zeilen folgendermaßen berechnen:

x = length(plots)

cols = round(sqrt(x),0)
rows = ceiling(x/cols)

Da die meisten Mehrfachplotfunktionen ncol und nrow als Argumente haben, können Sie diese einfach dort einfügen. Ich mag ggarrange von ggpubr.

ggarrange(plotlist = plots, ncol=cols, nrow = rows)

Dies begünstigt mehr Zeilen als Spalten. Kehren Sie also um, wenn Sie das Gegenteil wünschen. Dh für 6 Diagramme gibt es 3 Zeilen und 2 Spalten, nicht umgekehrt.

Adam Waring
quelle