R: salvataggio di più ggplot usando un ciclo for

Voglio automatizzare la generazione di un numero di ggplot:

Set di dati generici:

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

Specificare le variabili da includere:

 Start=2 Stop=5 

Elenco per salvare i grafici in:

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

Creare grafici:

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

Salva grafici:

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

L’elenco di grafici è generato; Posso anche salvare manualmente i grafici. Tuttavia, usando l’ultimo ciclo i file generati sono tutti vuoti. Non riesco a capire il motivo per questo.

Come suggerito da Roland, ho provato a print(gvec[[i-Start+1]]) ma ottengo comunque file vuoti come output.

Ecco un esempio completamente riproducibile di creazione di ggplot in un ciclo.

 # 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() 

inserisci la descrizione dell'immagine qui

Puoi anche utilizzare la funzione ggplot2 dalla libreria ggplot2 .

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

È ansible creare ed esportare i grafici nello stesso ciclo. Il codice combinato sarebbe:

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

Per un caso generale con dati impilati, dove la variabile id corrisponde al sottogruppo (paese, individuo, ecc.):

 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 }