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()?
png(); grid.arrange(); ggplot(); ggplot(); dev.off()
print(ggplot())
?ggplot
usoggsave()
, la resolución de la imagen es mucho mayor. ¿Hay alguna manera de guardar la salidagrid.arrange()
con una alta resolución, como sería si se guardara una sola parcelaggsave()
? Si proporciono, por ejemplo, las opciones,png(...,height=1600, width=2500)
la imagen se ve muy borrosa.Respuestas:
grid.arrange
dibuja directamente en un dispositivo.arrangeGrob
, por otro lado, no dibuja nada pero devuelve un grob alg
que puede pasarggsave(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.arrange
que este contador sea privado del paquete.fuente
plot(g)
es la forma correcta de mostrar una tabla, use en su lugar.grid.draw(g)
g <-arrangeGrob(...)
laprint(g)
te dan una mesa de texto con el gráfico de objetos en lugar de la gráfica. Intentagrid.draw(g)
representar el gráfico como gráficos. -Tuve algunos problemas con la propuesta de babptiste, pero finalmente la obtuve. Esto es lo que debes usar:
Esto debería funcionar bien.
fuente
Otra forma fácil de guardar un grid.arrange en un archivo pdf es usar pdf ():
Permite fusionar otras cosas que no sean ggplots en la disposición, como tablas ...
fuente
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.
La línea anterior es necesaria para corregir el error.
Ahora me funciona bien.
fuente
No es necesario que se arregle por sí mismo, puede asignar el resultado de grid.arrange directamente a un diagrama y guardarlo usando ggsave:
fuente
Otra solución simple: justo después de su
grid.arrange()
haces un
dev.copy()
fuente