Проблема сохранения графика с новыми строками на диск в R - PullRequest
0 голосов
/ 05 июня 2019

У меня есть цикл for, создающий серию графиков, и я хочу построить каждый из них в файле, например, в этот ответ .Проблема в том, что я не создаю новый график каждую новую итерацию, а вставляю перекрывающуюся линию на существующий холст.Код и ошибка приведены ниже:

   for(i in 1:10){
        png(filename = paste0("~/image", i))
        if(i == 1){
             plot(runif(10))
        }else{
             lines(runif(10))
        }
        dev.off()
   }

сообщение об ошибке:

Error in plot.xy(xy.coords(x, y), type = type, ...) : 
  plot.new has not been called yet

Я понимаю, что это потому, что холст не воссоздан, но не знаю, как решить эту проблему,Я попытался использовать dev.print (), но безуспешно.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

В настоящее время вы создаете новое устройство png на каждой итерации цикла. Вам нужно немного передвинуть вещи так, чтобы устройство было создано и затем выключено за пределами цикла, потому что вам нужно, чтобы это происходило только один раз:

png(filename = paste0("~/image", 1))
for(i in 1:10) {
    if(i == 1) {
         plot(runif(10))
    } else {
         lines(runif(10))
    }
}
dev.off()
0 голосов
/ 06 июня 2019

В ответ на пересмотренный вопрос, вот несколько решений.Чтобы сохранить серию файлов изображений с добавленными подряд строками, можно использовать dev.print.Вы должны добавить больше деталей к звонку.Вот решение в духе вашей логики:

for (i in 1:10) {
  if (i == 1)
    plot(runif(10)) # this could have inadequate y-limits 
  else {
    lines(runif(10))
  }
  fn <- paste0("~/image", i, ".png")
  dev.print(png, fn, width = 5, height = 5, unit = "in", res = 96)
}

Если результаты могут быть получены до печати, вам не нужно угадывать пределы графика.Вот решение, которое позволяет использовать png(), когда данные генерируются (или получаются) первыми.

v <- replicate(10, runif(10), simplify = FALSE)

for (i in seq_along(v)) {
  png(paste0("~/image", i, ".png"))
  plot(v[[1]], ylim = range(v))
  lapply(seq_len(i)[-1], function(j) lines(v[[j]]))
  dev.off()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...