2014-09-25 133 views
16

保存多個ggplots我想要自動化一些ggplots的產生:R:使用for循環

通用DataSet:

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

指定變量包括:

Start=2 
Stop=5 

列表以保存地塊:

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

創建地塊:

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

保存圖:

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

生成地塊的名單;我也可以手動保存劇情。但是,使用最後一個循環生成的文件都是空白的。我無法弄清楚這個原因。

根據羅蘭的建議,我試過 print(gvec[[i-Start+1]])但我仍然得到空白文件作爲輸出。

+0

'print(gvec [[i-Start + 1]])' – Roland 2014-09-25 08:51:18

+0

似乎沒有這樣做。仍爲空白文件。 – Pinemangoes 2014-09-25 09:01:06

+1

你需要明確調用'print'來繪製一個設備(這就是羅蘭所說的)。 – 2014-09-25 09:01:06

回答

42

下面是在循環中創建ggplots的完全可重複的示例。

# 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

1

您可以創建和相同的循環中導出地塊。將合併的代碼將是:

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

對於一般的情況下,與層疊的數據,其中該id變量對應於所述子組(國家,個體等)):

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

也可以使用的ggsave函數從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") 
}