2012-05-22 6 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. 

Vorrei organizzare i grafici utilizzando grid.arrange() in gridExtra.Come faccio a organizzare un elenco di variabili con l'uso di grid.arrange?

Come fare se il numero di grafici in plist è variabile?

Questo funziona: grid.arrange(plist[[1]],plist[[2]],plist[[3]],plist[[4]],plist[[5]])

ma ho bisogno di una soluzione più generale. pensieri?

+0

questo è in '? Grid.arrange' – baptiste

risposta

64

ne dite di questo:

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

enter image description here

+0

Questo è bello, tranne che la funzione non può gestire oggetti NULL. –

+0

Josh. Ti amo. Ho trascorso 2 ore su questo fino ad ora. Vorresti spiegare perché questo non funziona: 'grid.arrange (plist [[1: length (plist)]], ncol = nCol))" Ricevo un errore come questo: 'Errore in hl.plots [[1 : 12]]: nessun indice di questo tipo al livello 3! Grazie! – Anto

+1

@Anto Sembra che ci siano diverse cose che non funzionano con quel codice, ma quello che ti dà l'errore visualizzato è probabilmente causato dallo stesso tipo di errore mostrato qui: 'x <- list (1,2); x [[3: 1]] '. Più in generale, usa qualcosa come 'plist [...]' piuttosto che 'plist [[...]]' per fare il tuo subsetting. E poi usa 'do.call()', che dobbiamo usare perché 'grid.arrange()' non è impostato per prendere una lista come primo argomento. Saluti e buona fortuna! –

4

È possibile utilizzare grid.arrange() e arrangeGrob() con le liste, purché si specifichi l'elenco utilizzando l'argomento grobs = in ogni funzione. Per esempio. nell'esempio avete dato:

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

Per ragioni di completezza (e come questo vecchio, questione già risposto has been revived, recently) Vorrei aggiungere una soluzione che utilizza il pacchetto cowplot:

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

enter image description here

+0

qualsiasi idea sul perché passare un elenco di grafici usando questo codice restituisce questo errore: 'Errore in ggplot_to_gtable (x): L'argomento deve essere di classe" ggplot "o" gtable "' –

+0

Come sono stati generati i grafici? Usando il pacchetto 'ggplot2' o la grafica di base? – Uwe

+0

'ggplot2'. 'grid.arrange' ha quasi funzionato per me - ma, a quanto pare, la mia lista di trame non viene popolata. Ho postato il problema come una domanda: http://stackoverflow.com/questions/43216262/saving-multiple-ggplots-created-in-a-for-loop-to-a-single-plot. Quindi, mi chiedo se questo potrebbe essere stato il problema anche per il cowplot –

Problemi correlati