geom_label_repel - grid.arrange r
Guardando mĂșltiples ggplots de ls en uno y archivos separados en R (4)
Tengo varios ggplots como objetos en mi ls. Quiero guardarlos como archivos separados (aunque también me interesaría saber cómo guardarlos en 1 archivo grande). He leído esto: question y question pero parece que no puedo adaptar el código. También intenté Error in do.call("grid.arrange", plots2[[i]]) : second argument must be a list
todos en un archivo grande como se sugiere here pero obtengo este error: Error in do.call("grid.arrange", plots2[[i]]) : second argument must be a list
. Hay algo que me falta para obtener todos los ggplots en una lista.
Esto es lo que he intentado hasta ahora:
> ls() #List of objects on my ls. All the p* are my ggplots that I want to save.
[1] "all" "dat" "dat2" "dat3" "data" "dlook" "dlook2" "dlook3" "i" "look2" "mdfx"
[12] "objects" "order" "p" "p1" "p10" "p11" "p12" "p13" "p14" "p15" "p16"
[23] "p17" "p18" "p19" "p2" "p3" "p4" "p5" "p6" "p7" "p8" "p9"
> objects<-ls()
> plot<-objects[14:30]
> plots
[1] "p1" "p10" "p11" "p12" "p13" "p14" "p15" "p16" "p17" "p18" "p19" "p2" "p3" "p4" "p5" "p6" "p7" "p8" "p9"
> class(plots)
[1] "character"
plots2<-as.list(plots)#Transform into a list.
library(gridExtra) #Code suggested to create one pdf file.
pdf("test.pdf", onefile = TRUE)
for (i in seq(length(plots2))) {
do.call("grid.arrange", plots2[[i]])
}
dev.off()
Como ejemplo de un comentario de Joran y un suplemento a la respuesta de Baptiste, esta es la forma de inicializar una lista y almacenar gráficos en una lista por adelantado:
plots <- list()
plots[[1]] <- ggplot(...) # code for p1
plots[[2]] <- ggplot(...) # code for p2
## Depending on if your plots are scriptable, you could use a loop
for (i in 3:10) {
plots[[i]] <- ggplot(...) # code for plot i
}
Entonces esta lista, plots
, corresponde a l
en la respuesta de baptiste.
Cuando se usan listas, los corchetes simples, [
, se usan para las listas secundarias, donde se deben usar corchetes dobles [[
para obtener el elemento de una lista. Por ejemplo, las plots[[1]]
le darán el objeto ggplot
que es el primer elemento de las plots
, pero las plots[1]
le darán una lista de longitud que contiene esa primera parcela como un elemento. Esto puede parecer confuso al principio, pero tiene sentido, especialmente si solo desea trazar los primeros tres diagramas, luego puede usar myplots[1:3]
lugar de l
en cualquiera de los ejemplos de baptiste. (Vea ?"["
Para más detalles.)
Cuando te pones a ti mismo nombrando variables secuencialmente con números, por ejemplo, x1
, x2
, x3
, es una buena indicación de que deberías estar usando una lista.
Es mejor tener tus parcelas en una lista.
l = mget(plots)
Entonces simplemente puede imprimirlos página por página,
pdf("all.pdf")
invisible(lapply(l, print))
dev.off()
o guardar una parcela por archivo,
invisible(mapply(ggsave, file=paste0("plot-", names(l), ".pdf"), plot=l))
u organizarlos todos en una sola página,
ggsave("arrange.pdf", arrangeGrob(grobs = l))
u organizarlos 2x2 en varias páginas,
ggsave("arrange2x2.pdf", marrangeGrob(grobs = l, nrow=2, ncol=2))
etc.
(no probado)
Si las parcelas p1
, p10
, etc. ya existen, y quiere que se guarden como p1.pdf
, etc., entonces creo que debería hacerlo:
lapply(plots,function(x){ggsave(file=paste(x,"pdf",sep="."),get(x))})
ggsave(...)
tiene varios argumentos para especificar las dimensiones y el formato del archivo de salida.
Tenga en cuenta que no tiene que trabajar con lapply. Supongamos que tiene una lista que contiene todas sus parcelas:
MyPlots = list(plot1, plot2, plot3)
Solo usa:
pdf("all.pdf")
MyPlots
dev.off()