Salvataggio del diagramma grid.arrange () su file


137

Sto cercando di tracciare più grafici usando ggplot2, disponendoli usando grid.arrange(). Dal momento che sono riuscito a trovare qualcuno che descriva il problema esatto che ho, ho citato la descrizione del problema dal link :

Quando uso ggsave()dopo grid.arrange(), ad es

grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
ggsave("sgcirNIR.jpg")

Non salvo la trama della griglia ma l'ultimo ggplot individuale. Esiste un modo per salvare effettivamente la trama come visualizzata grid.arrange()utilizzando ggsave()o qualcosa di simile? Oltre a usare il vecchio modo

jpeg("sgcirNIR.jpg")
grid.arrange(sgcir1,sgcir2,sgcir3,ncol=2,nrow=2)
dev.off()

Lo stesso link fornisce la seguente soluzione:

require(grid)
require(gridExtra)
p <- arrangeGrob(qplot(1,1), textGrob("test"))
grid.draw(p) # interactive device
ggsave("saving.pdf", p) # need to specify what to save explicitly

Tuttavia, non riesco a capire come utilizzare ggsave()per salvare l'output della grid.arrange()chiamata nel seguente codice, che è preso dal link :

library(ggplot2)
library(gridExtra)
dsamp <- diamonds[sample(nrow(diamonds), 1000), ] 

p1 <- qplot(carat, price, data=dsamp, colour=clarity)
p2 <- qplot(carat, price, data=dsamp, colour=clarity, geom="path")

g_legend<-function(a.gplot){
tmp <- ggplot_gtable(ggplot_build(a.gplot))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
return(legend)}

legend <- g_legend(p1)
lwidth <- sum(legend$width)

## using grid.arrange for convenience
## could also manually push viewports
grid.arrange(arrangeGrob(p1 + theme(legend.position="none"),
                                        p2 + theme(legend.position="none"),
                                        main ="this is a title",
                                        left = "This is my global Y-axis title"), legend, 
                     widths=unit.c(unit(1, "npc") - lwidth, lwidth), nrow=1)

# What code to put here to save output of grid.arrange()?

6
Usapng(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie il

2
No print(ggplot())?
IRTFM,

@DWin Sì, probabilmente! :-)
Andrie,

1
@Andrie Quello che suggerisci funziona, ma la risoluzione dell'immagine è molto bassa. Quando salvo un singolo ggplotutilizzo ggsave(), la risoluzione dell'immagine è molto più alta. C'è un modo per salvare l'output di grid.arrange()con un'alta risoluzione, come sarebbe se fosse un singolo grafico salvato con ggsave()? Se fornisco ad esempio le opzioni, png(...,height=1600, width=2500)l'immagine appare molto sfocata.
Mi piace scrivere il codice

Risposte:


142

grid.arrangedisegna direttamente su un dispositivo. arrangeGrobd'altra parte, non disegna nulla ma restituisce un punto g, a cui puoi passare ggsave(file="whatever.pdf", g).

Il motivo per cui funziona in modo diverso rispetto agli oggetti ggplot, dove per impostazione predefinita viene salvato l'ultimo grafico se non specificato, è che ggplot2 tiene invisibilmente traccia dell'ultimo diagramma e non credo che grid.arrangedebba confondere questo contatore privato con il pacchetto.


3
Quando provo questo, ricevo un errore che mi dice che g non è del tipo giusto?
Jack Aidley,

@JackAidley pone una nuova domanda, con un esempio riproducibile minimo autonomo, e la tua sessionInfo () (assicurati di avere versioni recenti di R e pacchetti).
Baptista,

3
@DaveX, per favore, non divulgare queste informazioni fuorvianti; nonplot(g) è il modo giusto per visualizzare un gtable, usare invece. grid.draw(g)
Baptista,

@baptiste Grazie e rielaborato: se provi a vedere il risultato g <-arrangeGrob(...)con print(g)ottieni una tabella di testo che elenca gli oggetti grafici anziché quelli grafici. Prova grid.draw(g)a renderizzare l'immagine come grafica. -
Dave X,

7
ggsave non funziona più con (alcuni o tutti) i grobs.
Vak,

47

Ho avuto dei problemi con la proposta di babptiste, ma alla fine ho capito. Ecco cosa dovresti usare:

 # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

Questo dovrebbe funzionare bene.


24

Un altro modo semplice per salvare un grid.arrange in un file pdf è usare pdf ():

pdf("filename.pdf", width = 8, height = 12) # Open a new pdf file
grid.arrange(plot1, plot2, plot3, nrow=3) # Write the grid.arrange in the file
dev.off() # Close the file

Permette di unire altre cose oltre a ggplots nella disposizione, come le tabelle ...


7

Ho pensato che valesse la pena aggiungere questo. Ho avuto problemi con quanto sopra, con ggsave che produceva un errore: "la trama dovrebbe essere una trama ggplot2"

Grazie a questa risposta: salvando un grafico con ggsave dopo aver usato ggplot_build e ggplot_gtable ho una modifica al codice sopra.

  # draw your plots
 plot1 <- ggplot(...) # this specifies your first plot
 plot2 <- ggplot(...) # this specifies your second plot
 plot3 <- ggplot(...) # this specifies your third plot

 #merge all three plots within one grid (and visualize this)
 grid.arrange(plot1, plot2, plot3, nrow=3) #arranges plots within grid

 #save
 ggsave <- ggplot2::ggsave; body(ggsave) <- body(ggplot2::ggsave)[-2]

La riga precedente doveva correggere l'errore

 g <- arrangeGrob(plot1, plot2, plot3, nrow=3) #generates g
 ggsave(file="whatever.pdf", g) #saves g

Ora funziona bene per me.


Ne avevo bisogno. Apparentemente la versione di sviluppo di ggplot2 rimuove l'errore di test di classe in questo modo, ma la versione CRAN attualmente (21-10-2015) no.
Dave X,

2
Questo funziona con marrangeGrob per me, ma non con accordiGrob o grid.arrange. @ DaveX, hai dovuto fare qualcos'altro per farlo funzionare oltre a modificare ggsave come mostrato sopra? Grazie!
k13,

3

Non è necessario utilizzare organizzareGrob, è possibile assegnare il risultato di grid.arrange direttamente a un grafico e salvarlo utilizzando ggsave:

p3 <- grid.arrange(p1,p2, nrow = 1)
ggsave("filename.jpg", p3)

2

Un'altra soluzione semplice: subito dopo la tua grid.arrange()

grid.arrange(plot1, plot2, plot3, nrow=3)

tu fai un dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.