plots multiple graphs ggplot arrange r ggplot2 gridextra

multiple - Guardando grilla grid.arrange() para archivar



layout ggplot2 (4)

Otra forma fácil de guardar una cuadrícula. Arreglar un archivo pdf es usar 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

Permite fusionar otras cosas que ggplots en la disposición, como tablas ...

ggplot2 trazar múltiples diagramas usando ggplot2 , organizándolos usando grid.arrange() . Desde que logré encontrar a alguien que describa el problema exacto que tengo, he citado la descripción del problema desde el link :

Cuando uso ggsave() después de grid.arrange() , es decir

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

No guardo el gráfico de cuadrícula sino el último ggplot individual. ¿Hay alguna forma de guardar realmente el diagrama como se muestra en grid.arrange() usando ggsave() o algo similar? Aparte de usar la forma más antigua

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

El mismo enlace proporciona la solución a continuación:

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

Sin embargo, no puedo entender cómo usar ggsave() para guardar el resultado de la llamada a grid.arrange() en el siguiente código, que se toma del 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()?


Pensé que valía la pena agregar esto. Tuve problemas con lo anterior, con ggsave produciendo un error: "plot debe ser un argumento de ggplot2"

Gracias a esta respuesta: Guardando un gráfico con ggsave después de usar ggplot_build y ggplot_gtable , tengo una enmienda al código anterior.

# 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 línea anterior es necesaria para corregir el error

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

Ahora me funciona bien.


Tuve algunos problemas con la propuesta de Babptiste, pero finalmente lo conseguí. Esto es lo que deberías usar:

# 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

Esto debería funcionar bien.


grid.arrange dibuja directamente en un dispositivo. arrangeGrob , por otro lado, no dibuja nada, pero devuelve un grob g , que puede pasar a ggsave(file="whatever.pdf", g) .

La razón por la que funciona de manera diferente que con los objetos ggplot, donde por defecto se guarda el último gráfico, si no se especifica, es que ggplot2 realiza un seguimiento invisible de la última trama, y ​​no creo que grid.arrange deba meterse con este contador privado para el paquete.