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.
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()
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")
}
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
}