【问题标题】:Save multiple ggplots using a for loop使用 for 循环保存多个 ggplots
【发布时间】:2014-11-19 23:11:51
【问题描述】:

我想自动生成一些 ggplots:

通用数据集:

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]]) 但我仍然得到空白文件作为输出。

【问题讨论】:

  • print(gvec[[i-Start+1]])
  • 似乎没有这样做。仍然是空白文件。
  • 您需要显式调用print 以绘制到设备(这就是Roland 所说的)。
  • 我刚刚运行了你的代码,它对我有用。它产生 4 个 tiff 文件(当 print 函数按照建议添加到您的最终循环时)。

标签: r for-loop ggplot2


【解决方案1】:

您还可以使用ggplot2 库中的ggsave 函数。

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

【讨论】:

    【解决方案2】:

    您可以在同一个循环中创建和导出绘图。合并后的代码是:

    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
    }
    

    【讨论】:

      【解决方案3】:

      这是一个在循环中创建 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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 2021-04-26
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多