2012-09-02 15 views
16

Ho una lista, p, in cui ogni elemento di p è un elenco di oggetti di disegno ggplot2.Stampa di più ggplot in un singolo pdf, più grafici per pagina

Vorrei uscita un singolo PDF contenente tutte le trame in p in modo tale che le trame in p[[1]] sulla pagina 1, le trame in p[[2]] sono a pagina 2, ecc Come potrei fare questo?

Ecco alcuni esempi di codice per fornire la struttura dati con cui sto lavorando - scuse per i grafici noiosi, ho scelto le variabili a caso.

require(ggplot2) 
p <- list() 

cuts <- unique(diamonds$cut) 
for(i in 1:length(cuts)){ 
    p[[i]] <- list() 
    dat <- subset(diamonds, cut==cuts[i]) 
    p[[i]][[1]] <- ggplot(dat, aes(price,table)) + geom_point() + 
     opts(title=cuts[i]) 
    p[[i]][[2]] <- ggplot(dat, aes(price,depth)) + geom_point() + 
     opts(title=cuts[i]) 
} 
+0

Ecco un potenziale inizio: 'require (gridExtra); do.call ("grid.arrange", p [[i]]) '. Questo traccerà gli oggetti ggplot in p [[i]] in un singolo dispositivo, disponendoli bene. – Michael

+0

Cerca anche nel pacchetto gridExtra. Penso che dovresti prenderti la maggior parte del modo lì – chandler

risposta

15

Questa soluzione è indipendente dal fatto che le lunghezze degli elenchi nell'elenco p siano diverse.

library(gridExtra) 

pdf("plots.pdf", onefile = TRUE) 
for (i in seq(length(p))) { 
    do.call("grid.arrange", p[[i]]) 
} 
dev.off() 

causa della onefile = TRUE funzione pdf salva tutti gli elementi grafici che appaiono in sequenza nello stesso file (una pagina per un grafico).

+0

Questo ha funzionato perfettamente, grazie! – Michael

+1

Per me, questo risulta in un PDF danneggiato che non può essere aperto. Le trame sembrano bene individualmente. Qualche consiglio? –

+0

opts() non ha funzionato per me su 'ggplot2_2.2.1' e' R versione 3.3.2 '. Usa invece '+ ggtitle (cuts [i])'. –

2

Ecco una soluzione, ma non mi piace particolarmente:

ggsave("test.pdf", do.call("marrangeGrob", c(unlist(p,recursive=FALSE),nrow=2,ncol=1)))

Il problema è che si basa sulla presenza dello stesso numero di trame in ciascun gruppo. Se all(sapply(p, length) == 2) fosse falso, allora si romperebbe.

7

Ecco una versione più semplice della soluzione di Sven per i principianti R che altrimenti userebbero ciecamente le liste do.call e nidificate di cui non hanno bisogno né capiscono. Ho prove empiriche. :)

library(ggplot2) 
library(gridExtra) 

pdf("plots.pdf", onefile = TRUE) 
cuts <- unique(diamonds$cut) 
for(i in 1:length(cuts)){ 
    dat <- subset(diamonds, cut==cuts[i]) 
    top.plot <- ggplot(dat, aes(price,table)) + geom_point() + 
     opts(title=cuts[i]) 
    bottom.plot <- ggplot(dat, aes(price,depth)) + geom_point() + 
     opts(title=cuts[i]) 
    grid.arrange(top.plot, bottom.plot) 
} 
dev.off() 
Problemi correlati