web-dev-qa-db-fra.com

Enregistrer plusieurs ggplots à l'aide d'une boucle for

Je souhaite automatiser la génération d'un certain nombre de ggplots:

Jeu de données générique:

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

Spécifiez les variables à inclure:

Start=2
Stop=5

Liste pour enregistrer les tracés dans:

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

Créer des tracés:

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 les tracés:

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 tracés est générée; Je peux également enregistrer les tracés manuellement. Cependant, en utilisant la dernière boucle, les fichiers générés sont tous vides. Je ne peux pas comprendre la raison de cela.

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

28
Pinemangoes

Voici un exemple entièrement reproductible de création de ggplots en 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

58
bdemarest

Vous pouvez également utiliser la fonction ggsave de 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")
}
13
rafa.pereira

Vous pouvez créer et exporter les tracés dans la même boucle. Le code combiné 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ù la variable id 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
luchonacho