在RStudio中循环绘图

时间:2012-01-07 20:00:58

标签: r plot rstudio

我正在实施R(模拟退火)中的旅行商问题(TSP)的解决方案,我想定期输出当前的最佳路径。我已经搜索了很多关于如何在for循环期间输出图并且迄今为止失败的问题。

我使用RStudio,并希望在生成图形时看到它们。如果您曾经看过TSP解决方案,那么您将了解它的酷炫程度。以下是我想看到的http://www.staff.science.uu.nl/~beuke106/anneal/anneal.html

的图形输出示例

我认为内存使用不会成为问题(在大约500,000次迭代期间,我只期望50-100个图)。这是一个示例函数,我们希望在函数运行期间看到10个不同的图:

Plotz <- function(iter = 1000000, interval = 100000) {
  x <- 1:10
  for(i in 1:iter){
    y <- runif(10)
    if(i %% interval == 0) {
      plot(x, y)
    }
  }
  return(c(x, y))
}
Plotz()

当我运行时,我看到的是最终的情节(在RStudio中)。如何生成这些图?

另外:我在Ubuntu上(无论最新的稳定版本是什么)。不知道那是否相关。

提前谢谢大家。

编辑:根据Murphy上尉的建议,我尝试在Linux终端上运行它,图形出现了。我仍然想到“如何在RStudio中做到这一点?”的问题。然而,仍然是相关的。这是一个非常好的程序,所以也许有人知道如何才能让它发挥作用?

EDIT2:正如Thilo所说,这是Rstudio中的一个已知错误。如果有人在没有修复软件的情况下有任何其他想法来解决这个问题,那么还有一些事情需要讨论。否则,请考虑解决这个问题。

7 个答案:

答案 0 :(得分:17)

调用Sys.sleep(0)会导致绘图。与X11解决方案不同,这也适用于RStudio的服务器版本。

(我很惊讶dev.flush()没有给出你希望的结果,这可能是一个bug。)

答案 1 :(得分:8)

你可以做的一件事是打开一个x11窗口并在那里绘图:

x11()
Plotz()

这应该与在终端中运行它一样。

答案 2 :(得分:8)

跟进@ JoeCheng的回答和@RGuy对该答案的评论:正如我worked out with the RStudio folks所述,问题似乎主要发生在太短的时间跨度上有太多的情节。解决方案有两个方面:

  • Sys.sleep(0)有助于强制更新绘图窗口。
  • 绘制每W个循环而不是每个循环的更新。

例如,在我的计算机(i7,RStudio Server)上,以下代码在循环完成之前不会更新:

N <- 1000
x <- rep(NA,N)
plot(c(0,1)~c(0,N), col=NA)
for(i in seq(N)) {
  Sys.sleep(.01)
  x[i] <- runif(1)
  iseq <- seq(i-99,i)
  points( x[i]~i )
  Sys.sleep(0)
}

以下代码实时更新,尽管要绘制的点数相同:

N <- 1000
x <- rep(NA,N)
plot(c(0,1)~c(0,N), col=NA)
for(i in seq(N)) {
  Sys.sleep(.01)
  x[i] <- runif(1)
  iseq <- seq(i-99,i)
  if(i%%100==0) {
    points( x[iseq]~iseq )
    Sys.sleep(0)
  }
}

换句话说,它是plot似乎重要的调用次数,而不是要绘制的数据量。

答案 3 :(得分:2)

如果你想保存这些图,你可以在循环中打开一个新设备然后关闭它。

Plotz <- function(iter = 1000, interval = 100) {
  x <- 1:10

  p <- 0 #plot number

  for(i in 1:iter){

    y <- runif(10)
    if(i %% interval == 0) {
        png(file=paste(i,"png",sep="."))
        p <- p + 1; plot(x, y)
        dev.off()
    }
  }
return(c(x, y))
}

答案 4 :(得分:1)

Plotz <- function(iter = 1000, interval = 100) {
  x <- 1:10
  p <- 0 #plot number
  for(i in 1:iter){
    y <- runif(10)
    if(i %% interval == 0) {
        p <- p + 1; plot(x, y)
        readline("Please press the Enter key to see the next plot if there is one.")
    }
  }
  return(c(x, y))
}
Plotz()

答案 5 :(得分:1)

您还可以使用RStudio界面左下方面板图表标签上的后退箭头来查看图表。

答案 6 :(得分:0)

您可以使用animate包将图表分层为GIF。