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.