使用循环记录一系列绘图

时间:2015-01-17 18:44:59

标签: r loops plot

我有一个名为primes的长度为100的向量,其中包含前一百个素数,如下所示:

primes
  [1]   2   3   5   7  11  13  17  19  23  29  31  37  41  43  47  53  59  61  67  71  73  79  83  89  97 101 103 107 109
 [30] 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271
 [59] 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449
 [88] 457 461 463 467 479 487 491 499 503 509 521 523 541

我还有一个名为optm的数据框,所有这些素数作为变量,学习率越来越低。这是我通过绘制第37个素数得到的例子:

plot.default(optm$step, optm$seed37, type = "l", ylab = "learning rate",
             xlab = "first third iterations", main = 'seed37')

enter image description here

我想在4 * 5多帧上提取并保存所有这一百个图。因此,我想要5个文件(= 100个图表),这就是为什么我在以下循环中将a作为记录限制实现的原因:

   a <- 20
    par(mfrow = c(4, 5))
    for(i in primes) { 
      cln <- paste0("seed",i)
      plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)
      for(j in 1:length(primes)) { 
      if (j==a){
             dev.copy(png, paste0(j,'optm.png'),width=8,height=6,units="in",res=100)
             a = a + 20
             dev.off()                 
    }
    }
    }

问题是我的计算机上录制的文件是相似的,并且拥有完全相同的情节(第一个种子2)。我的错误在哪里?

编辑:

a = 0
par(mfrow = c(4, 5))
for(i in primes) { for(j in length(primes)) {cln <- paste0("seed",i)
               plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)  
               a = (a +1)
               if(a==20) {
                dev.copy(png, paste0(j,'optm.png'),width=8,height=6,units="in",res=100)
                dev.off()
                                                          }
     }
}

这个模式适用于前20个。所以我编码了这样的seq:

foo = seq(0, length(primes), by=20)

现在,我需要在foo命令中调用if的任何值而不是20。我该如何管理?

2 个答案:

答案 0 :(得分:1)

你只需要1个循环:

a <- 20
par(mfrow = c(4, 5))
for(i in seq(length(primes))) { 
  cln <- paste0("seed",primes[i])
  plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)
  if (i&&a == 0){
         dev.copy(png, paste0(i,'optm.png'),width=8,height=6,units="in",res=100)
         dev.off()                 
  }
}

答案 1 :(得分:0)

很抱歉回答我自己的问题,但我找到了办法。不是最好的,但以下代码正在运行。

a = 0
b = 20
par(mfrow = c(4, 5))
for(i in primes) {cln <- paste0("seed",i)
               plot.default(optm$step, optm[,cln], type = "l", ylab = "learning rate", xlab = "step first third", main = cln)  
               a = (a +1)
               print(a)
               if (a == b) {
               dev.copy(png, paste0(a,'optm.png'),width=8,height=6,units="in",res=100)
               b =(b +20)
               dev.off()                                                        }
     }

每次a到达b时,都会制作一个情节系列的记录。每次a到达b时,b都会增加20.我对任何优化它的方法持开放态度,特别是删除a和b并调用类似这样的seq:< / p>

foo = seq(0, length(primes), by=20)