Dies wird in der Google-Gruppe ggplot2 veröffentlicht
Meine Situation ist, dass ich an einer Funktion arbeite , die eine beliebige Anzahl von Plots ausgibt (abhängig von den vom Benutzer bereitgestellten Eingabedaten). Die Funktion gibt eine Liste von n Plots zurück, und ich möchte diese Plots in 2 x 2-Formation anordnen. Ich kämpfe mit den gleichzeitigen Problemen von:
- Wie kann ich zulassen, dass der Flexibilität eine beliebige (n) Anzahl von Parzellen übergeben wird?
- Wie kann ich auch angeben, dass sie 2 x 2 angelegt werden sollen?
Meine aktuelle Strategie verwendet grid.arrange
aus dem gridExtra
Paket. Es ist wahrscheinlich nicht optimal, zumal, und das ist der Schlüssel, es funktioniert überhaupt nicht . Hier ist mein kommentierter Beispielcode, der mit drei Plots experimentiert:
library(ggplot2)
library(gridExtra)
x <- qplot(mpg, disp, data = mtcars)
y <- qplot(hp, wt, data = mtcars)
z <- qplot(qsec, wt, data = mtcars)
# A normal, plain-jane call to grid.arrange is fine for displaying all my plots
grid.arrange(x, y, z)
# But, for my purposes, I need a 2 x 2 layout. So the command below works acceptably.
grid.arrange(x, y, z, nrow = 2, ncol = 2)
# The problem is that the function I'm developing outputs a LIST of an arbitrary
# number plots, and I'd like to be able to plot every plot in the list on a 2 x 2
# laid-out page. I can at least plot a list of plots by constructing a do.call()
# expression, below. (Note: it totally even surprises me that this do.call expression
# DOES work. I'm astounded.)
plot.list <- list(x, y, z)
do.call(grid.arrange, plot.list)
# But now I need 2 x 2 pages. No problem, right? Since do.call() is taking a list of
# arguments, I'll just add my grid.layout arguments to the list. Since grid.arrange is
# supposed to pass layout arguments along to grid.layout anyway, this should work.
args.list <- c(plot.list, "nrow = 2", "ncol = 2")
# Except that the line below is going to fail, producing an "input must be grobs!"
# error
do.call(grid.arrange, args.list)
Wie ich es gewohnt bin, dränge ich mich demütig in die Ecke und warte gespannt auf das kluge Feedback einer Community, die viel weiser als ich ist. Vor allem, wenn ich das schwieriger mache, als es sein muss.
Antworten:
Du bist fast da! Das Problem ist, dass
do.call
erwartet wird, dass sich Ihre Argumente in einem benanntenlist
Objekt befinden. Sie haben sie in die Liste aufgenommen, aber als Zeichenfolgen, nicht als benannte Listenelemente.Ich denke das sollte funktionieren:
Wie Ben und Joshua in den Kommentaren betonten, hätte ich bei der Erstellung der Liste Namen vergeben können:
oder
quelle
args.list <- list(x=x, y=y, z=x, nrow=2, ncol=2)
do.call
erfolgreich zu sein, wäre eine genaue Positionsübereinstimmung erforderlich gewesen.traceback()
Informationen, wenn Sie benannte Argumente verwenden.grid.arrange()
die...
Positionsanpassung wahrscheinlich irrelevant ist. Jede Eingabe muss entweder ein Rasterobjekt (mit oder ohne Namen), ein benannter Parameter fürgrid.layout
oder ein benannter Parameter für die verbleibenden Argumente sein.Versuche dies,
quelle
ggsave("multipage.pdf", do.call(marrangeGrob, c(plots, list(nrow=2, ncol=2))))
Ich antworte etwas spät, bin aber auf eine Lösung im R Graphics Cookbook gestoßen, die mit einer benutzerdefinierten Funktion namens etwas sehr Ähnliches bewirkt
multiplot
. Vielleicht hilft es anderen, die diese Frage finden. Ich füge auch die Antwort hinzu, da die Lösung möglicherweise neuer ist als die anderen Antworten auf diese Frage.Mehrere Grafiken auf einer Seite (ggplot2)
Hier ist die aktuelle Funktion, verwenden Sie jedoch bitte den obigen Link, da der Autor festgestellt hat, dass sie für ggplot2 0.9.3 aktualisiert wurde, was darauf hinweist, dass sie sich möglicherweise erneut ändert.
Man erstellt Handlungsobjekte:
Und gibt sie dann an
multiplot
:quelle