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