2012-05-22 4 views
42
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 Plots mit grid.arrange() in gridExtra arrangieren.Wie ordne ich eine variable Liste von Plots mit grid.arrange an?

Wie würde ich das tun, wenn die Anzahl der Plots in plist variabel ist?

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

aber ich brauche eine allgemeinere Lösung. Gedanken?

+0

das ist in '? Grid.arrange' – baptiste

Antwort

64

Wie wäre es damit:

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

enter image description here

+0

Das ist nett, außer die Funktion kann nicht mit NULL-Objekten umgehen. –

+0

Josh. Ich liebe dich. Habe bis jetzt 2 Stunden damit verbracht. Möchten Sie erklären, warum das nicht funktioniert: 'grid.arrange (plist [[1: length (plist)]], ncol = nCol))' Ich erhalte einen Fehler wie folgt: 'Fehler in hl.plots [[1 : 12]]: kein solcher Index auf Level 3' Danke! – Anto

+1

@Anto Es scheint, dass einige Dinge mit diesem Code nicht stimmen, aber derjenige, der den angezeigten Fehler anzeigt, wird wahrscheinlich durch die gleiche Art von Fehler verursacht, wie hier gezeigt: 'x <- list (1,2); x [[3: 1]] '. Im weiteren Sinne, verwenden Sie etwas wie 'plist [...]' statt 'plist [[...]]', um Ihre Teilmenge zu tun. Und dann verwenden Sie 'do.call()', was wir verwenden müssen, da 'grid.arrange()' nicht dafür eingerichtet ist, eine Liste als erstes Argument zu nehmen. Prost und viel Glück! –

4

Sie grid.arrange() und arrangeGrob() mit Listen verwenden können, solange Sie die Liste mit der grobs = Argument in jeder Funktion angeben. Z.B. im Beispiel geben Sie:

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 
5

Aus Gründen der Vollständigkeit (und wie diese alten, bereits beantworteten Frage has been revived, recently) Ich möchte eine Lösung mit dem cowplot Paket hinzuzufügen:

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

enter image description here

+0

eine Idee, warum die Übergabe einer Liste von Plots mit diesem Code diesen Fehler zurückgibt: 'Fehler in ggplot_to_gtable (x): Argument muss der Klasse" ggplot "oder" gtable "sein' –

+0

Wie wurden die Plots generiert? Verwenden Sie das Paket 'ggplot2' oder die Basisgrafik? – Uwe

+0

'ggplot2'. 'grid.arrange' hat fast für mich funktioniert - aber es stellt sich heraus, dass meine Liste von Plots nicht ausgefüllt wird. Ich habe das Problem als Frage gestellt: http://stackoverflow.com/questions/43216262/saving-multiple-ggplots-created-in-a-for-loop-to-a-single-plot. Ich frage mich, ob das auch für Cowplot hätte sein können –

Verwandte Themen