R: enregistrement de plusieurs ggplots en utilisant une boucle for

je veux automatiser la génération d'un certain nombre de ggplots:

Générique dataset:

mydata<-data.frame(matrix(rnorm(100),ncol=5))
names(mydata)<-c("Tijd","X1","X2","X3","X4") 

Spécifier les variables à inclure:

Start=2
Stop=5

Liste pour enregistrer les tracés dans:

gvec<-vector("list",length=length(Start:Stop))

Créer des parcelles:

for(i in Start:Stop){
  graphy<-ggplot(mydata,aes_string(x="Tijd",y=names(mydata)[i]))+geom_point()+mytheme
  gvec[[i-Start+1]]<-graphy
}

Enregistrer parcelles:

for(i in Start:Stop){
tiff(paste0("Test/Residu/Plots/Prei/mydata.",names(mydata)[i],"09.14.tiff"),width=720,height=720)
gvec[[i-Start+1]]
graphics.off()
}

la liste des placettes est générée; je peux aussi enregistrer les placettes manuellement. Cependant, l'utilisation de la dernière boucle les fichiers générés sont tous vides. Je ne peux pas comprendre la raison pour cela.

selon la suggestion de Roland j'ai essayé print(gvec[[i-Start+1]]) mais j'obtiens toujours des fichiers vierges en sortie.

19
demandé sur Pinemangoes 2014-09-25 12:44:38

3 réponses

voici un exemple entièrement reproductible de création de ggplots dans une boucle.

# Plot separate ggplot figures in a loop.
library(ggplot2)

# Make list of variable names to loop over.
var_list = combn(names(iris)[1:3], 2, simplify=FALSE)

# Make plots.
plot_list = list()
for (i in 1:3) {
    p = ggplot(iris, aes_string(x=var_list[[i]][1], y=var_list[[i]][2])) +
        geom_point(size=3, aes(colour=Species))
    plot_list[[i]] = p
}

# Save plots to tiff. Makes a separate file for each plot.
for (i in 1:3) {
    file_name = paste("iris_plot_", i, ".tiff", sep="")
    tiff(file_name)
    print(plot_list[[i]])
    dev.off()
}

# Another option: create pdf where each page is a separate plot.
pdf("plots.pdf")
for (i in 1:3) {
    print(plot_list[[i]])
}
dev.off()

enter image description here

45
répondu bdemarest 2014-09-27 19:42:32

vous pouvez aussi utiliser le ggsave function ggplot2 bibliothèque.

library(ggplot2)
data("iris")

# list of values to loop over
  uniq_species = unique(iris$Species)


# Loop

for (i in uniq_species) {

  temp_plot = ggplot(data= subset(iris, Species == i)) + 
                  geom_point(size=3, aes(x=Petal.Length, y=Petal.Width )) +
                  ggtitle(i)

  ggsave(temp_plot, file=paste0("plot_", i,".png"), width = 14, height = 10, units = "cm")
}
6
répondu rafa.pereira 2017-12-12 16:34:54

vous pouvez créer et exporter les parcelles dans la même boucle. Le code serait:

for(i in Start:Stop){
  graphy<-ggplot(mydata,aes_string(x="Tijd",y=names(mydata)[i]))+geom_point()+mytheme
  tiff(paste0("Test/Residu/Plots/Prei/mydata.",names(mydata)[i],"09.14.tiff"),width=720,height=720)
  print(graphy)
  dev.off()  
}

pour un cas général avec des données empilées, où le id variable correspond au sous-groupe (pays, individu, etc):

for (i in 1:10) {
  mydata_id <- subset(mydata, id == i) # subselect group
  p <- ggplot(mydata_id, aes(x, y)) + geom_line() # create graph
  png(paste("plot_", i, ".png", sep = ""), width=600, height=500, res=120) # start export
  print(p) 
  dev.off() # finish export
}
1
répondu luchonacho 2016-12-06 18:11:43