J'ai plusieurs ggplots comme objets sur mon ls. Je veux les enregistrer en tant que fichiers séparés (bien que je serais également intéressé de savoir comment les enregistrer tous sous 1 gros fichier). J'ai lu ceci: question et question mais je n'arrive pas à adapter le code. J'ai également essayé de les tracer tous dans un gros fichier comme suggéré ici mais j'obtiens cette erreur: Error in do.call("grid.arrange", plots2[[i]]) : second argument must be a list
. Il me manque quelque chose pour obtenir tous les ggplots dans une seule liste.
Voici ce que j'ai essayé jusqu'à présent:
> 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()
il est préférable d'avoir vos parcelles dans une liste
l = mget(plots)
Ensuite, vous pouvez simplement les imprimer page par page,
pdf("all.pdf")
invisible(lapply(l, print))
dev.off()
ou enregistrez un tracé par fichier,
invisible(mapply(ggsave, file=paste0("plot-", names(l), ".pdf"), plot=l))
ou organisez-les tous sur une seule page,
ggsave("arrange.pdf", arrangeGrob(grobs = l))
ou les disposer 2x2 en plusieurs pages,
ggsave("arrange2x2.pdf", marrangeGrob(grobs = l, nrow=2, ncol=2))
etc.
(non testé)
Notez que vous n'avez pas à travailler avec lapply. Supposons que vous ayez une liste contenant toutes vos parcelles:
MyPlots = list(plot1, plot2, plot3)
Utilisez simplement:
pdf("all.pdf")
MyPlots
dev.off()
Si les tracés p1
, p10
, Etc. existent déjà et que vous souhaitez les enregistrer sous p1.pdf
, Etc., alors je pense que cela devrait le faire:
lapply(plots,function(x){ggsave(file=paste(x,"pdf",sep="."),get(x))})
ggsave(...)
a un certain nombre d'arguments pour spécifier les dimensions et le format du fichier de sortie.
Comme exemple étoffant le commentaire de Joran, et un complément à la réponse de Baptiste, voici comment vous initialisez une liste et stockez des parcelles dans une liste à l'avance:
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
}
Cette liste, plots
, correspond à l
dans la réponse de baptiste.
Lorsque vous utilisez des listes, des crochets simples, [
, sont utilisés pour les sous-listes, où vous devez utiliser des crochets doubles [[
pour obtenir l'élément d'une liste. Par exemple, plots[[1]]
vous donnera l'objet ggplot
qui est le premier élément de plots
, mais plots[1]
vous donnera une liste d'une longueur contenant ce premier tracé en tant qu'élément. Cela peut sembler déroutant au début, mais cela a du sens, surtout si vous vouliez simplement tracer les trois premiers tracés, alors vous pourriez utiliser myplots[1:3]
au lieu de l
dans l'un des exemples de baptiste. (Voir ?"["
pour plus de détails.)
Chaque fois que vous vous surprenez à nommer des variables de manière séquentielle avec des nombres, par exemple, x1
, x2
, x3
, c'est une bonne indication que vous devriez plutôt utiliser une liste.