Sauvegarder plusieurs ggplots de ls dans un seul et même fichier et les séparer dans R

j'ai plusieurs ggplots comme objets sur ma ls. Je veux les enregistrer en tant que fichiers distincts (bien que je serais aussi intéressé de savoir comment les enregistrer sous 1 gros fichier). J'ai lu ceci: question et question mais je n'arrive pas à adapter le code. J'ai aussi essayé de les regrouper en un seul gros fichier comme suggéré ici mais n'obtiens cette erreur: Error in do.call("grid.arrange", plots2[[i]]) : second argument must be a list. Il y a quelque chose que je manque en obtenant tous les gtplots dans une liste.

Ceci est 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()
17
demandé sur Community 2013-12-10 21:04:59

4 réponses

il est préférable d'avoir votre parcelles dans une liste

l = mget(plots)

alors vous pouvez simplement les imprimer page par page,

pdf("all.pdf")
invisible(lapply(l, print))
dev.off()

ou enregistrer une parcelle de terrain par fichier,

invisible(mapply(ggsave, file=paste0("plot-", names(l), ".pdf"), plot=l))

ou arranger le tout dans une seule page,

ggsave("arrange.pdf", arrangeGrob(grobs = l))

ou organiser 2x2 dans plusieurs pages,

ggsave("arrange2x2.pdf", marrangeGrob(grobs = l, nrow=2, ncol=2))

etc.

(non testé)

44
répondu baptiste 2016-04-14 21:20:21

Si les parcelles p1,p10, etc. existe déjà, et vous voulez les sauver comme p1.pdf, etc. puis 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.

5
répondu jlhoward 2013-12-10 18:27:53

a titre d'exemple reprenant le commentaire de Joran, et un supplément à la réponse de Baptiste, voici comment vous initialiseriez une liste et stockeriez des tracés 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
}

alors cette liste,plots correspond à

Lorsqu'on utilise des listes, des crochets simples,[, sont utilisés pour les sous-listes, où vous devez utiliser des doubles crochets [[ pour obtenir l'élément d'une liste. Par exemple, plots[[1]] vous donnera l' ggplot objet qui est le premier élément de plots, mais plots[1] vous donnera une longueur une liste contenant le premier graphe comme élément. Cela peut sembler confus au début, mais cela a du sens, surtout si vous vouliez simplement tracer les trois premières parcelles, alors vous pourriez utiliser myplots[1:3] au lieu de l dans des baptiste exemples. (Voir?"[" pour plus de détails.)

chaque fois que vous vous surprenez à nommer des variables de façon séquentielle avec des nombres, par exemple,x1,x2,x3, c'est une bonne indication que tu devrais utiliser une liste à la place.

4
répondu Gregor 2013-12-10 19:34:51

Notez que vous n'avez pas à travailler avec lapply. Supposons que vous ayez une liste contenant toutes vos parcelles:

MyPlots = list(plot1, plot2, plot3)

utilisation:

pdf("all.pdf")
MyPlots
dev.off()
2
répondu Rtist 2017-07-27 08:37:45