Guardar grid.arrange () plot en el archivo


137

Estoy tratando de trazar varias parcelas usando ggplot2, organizándolas usando grid.arrange(). Como logré encontrar a alguien que describa el problema exacto que tengo, he citado la descripción del problema en el enlace :

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

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

No guardo el diagrama de cuadrícula sino el último ggplot individual. ¿Hay alguna forma de guardar realmente la trama como se muestra mediante el grid.arrange()uso 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 da 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 la salida de la grid.arrange()llamada en el siguiente código, que se toma del enlace :

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()?

66
Usopng(); grid.arrange(); ggplot(); ggplot(); dev.off()
Andrie

2
No print(ggplot())?
IRTFM

@DWin ¡Sí, probablemente! :-)
Andrie

1
@ Andrew Lo que sugieres funciona, pero la resolución de la imagen es muy baja. Cuando guardo un solo ggplotuso ggsave(), la resolución de la imagen es mucho mayor. ¿Hay alguna manera de guardar la salida grid.arrange()con una alta resolución, como sería si se guardara una sola parcela ggsave()? Si proporciono, por ejemplo, las opciones, png(...,height=1600, width=2500)la imagen se ve muy borrosa.
Me gusta codificar el

Respuestas:


142

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

La razón por la que funciona de manera diferente que con los objetos ggplot, donde de forma predeterminada se guarda la última trama si no se especifica, es que ggplot2 hace un seguimiento invisible de la última trama, y ​​no creo grid.arrangeque este contador sea privado del paquete.


3
Cuando intento esto, aparece un error que me dice que g no es del tipo correcto.
Jack Aidley

@JackAidley hace una nueva pregunta, con un ejemplo reproducible autocontenido mínimo, y su sessionInfo () (asegúrese de tener versiones recientes de R y paquetes).
Baptiste

3
@DaveX por favor no difunda esta información engañosa; noplot(g) es la forma correcta de mostrar una tabla, use en su lugar. grid.draw(g)
Baptiste

Gracias @baptiste y reelaborado: Tenga en cuenta que si intenta ver el resultado de g <-arrangeGrob(...)la print(g)te dan una mesa de texto con el gráfico de objetos en lugar de la gráfica. Intenta grid.draw(g)representar el gráfico como gráficos. -
Dave X

77
ggsave ya no funciona con (algunos o todos) grobs.
vak

47

Tuve algunos problemas con la propuesta de babptiste, pero finalmente la obtuve. Esto es lo que debes 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.


24

Otra forma fácil de guardar un grid.arrange en 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 no sean ggplots en la disposición, como tablas ...


7

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

Gracias a esta respuesta: Guardar 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.


Necesitaba esto. Aparentemente, la versión de desarrollo de ggplot2 elimina el error de prueba de clase de esta manera, pero la versión CRAN actualmente (21/10/2015) no lo hace.
Dave X

2
Esto funciona con marrangeGrob para mí, pero no conrangeGrob o grid.arrange. @ DaveX, ¿necesitaba hacer algo más para que funcionara además de modificar ggsave como se muestra arriba? ¡Gracias!
k13

3

No es necesario que se arregle por sí mismo, puede asignar el resultado de grid.arrange directamente a un diagrama y guardarlo usando ggsave:

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

2

Otra solución simple: justo después de su grid.arrange()

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

haces un dev.copy()

dev.copy(pdf,"whatever.pdf")
dev.off()
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.