Salvataggio grid.arrange () del grafico su file


Answers

Ho avuto qualche problema con la proposta di babptiste, ma alla fine l'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.

Question

Sto cercando di tracciare più trame usando ggplot2 , disponendole usando grid.arrange() . Da quando sono riuscito a trovare qualcuno che descrivesse il problema esatto che ho, ho citato dalla descrizione del problema dal link :

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

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

Non salvi la trama della griglia ma l'ultimo singolo ggplot. Esiste un modo per salvare effettivamente il grid.arrange() come visualizzato da grid.arrange() usando ggsave() o qualcosa di simile? Altro che usare la vecchia maniera

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

Lo stesso link fornisce la soluzione di seguito:

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 usare ggsave() per salvare l'output della chiamata grid.arrange() 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()?



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

Grazie a questa risposta: Salvataggio di 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 per me bene.




Links