如何在R中显示动画实时模拟结果?

时间:2017-05-01 18:23:58

标签: r animation plot real-time simulation

我正在使用R来运行一些蒙特卡罗模拟,这些模拟花费了相当多的时间。能够沿多个维度实时监控模拟结果真的很棒。令我惊讶的是,我没有找到一个好的包装来做到这一点,而我提出的每个黑客都有它的缺陷。我发帖说明是否有人想出更好的东西。

这种情节的基本问题是,虽然分屏是理想的,但要让屏幕平滑准确地更新是很棘手的。简单地发出一个新的plot()命令非常慢,导致Quartz窗口严重闪烁。保存为PDF并使用Skim在更新时查看PDF,但它也会在太长时间内开始闪烁。有一些方法可以在plot()和split.screen()中切换面板,以便添加到绘图而不是完全重绘它们,但是它们有它们的问题:split.screen的文档警告“与返回到屏幕相关的行为添加到现有的绘图是不可预测的,可能会导致不易看到的问题“(我已经验证了这一点)。

使用来自this post的聪明技巧,我设法在基础R中设置了一个模拟监视器,主要是这个技巧。这是一个MWE:

x <- rnorm(100)
par(mfrow=c(1,2))

pars <- c('plt','usr')
plot(1, x[1], xlim=c(1,100), ylim=c(-3,3), main="x", xlab=" ", ylab=" ")
par1 <- c(list(mfg=c(1,1,1,2)), par(pars))
plot(1, x[1], xlim=c(1,100), ylim=c(-3,3), type="n", main="running mean(x)", xlab=" ", ylab=" ")
par2 <- c(list(mfg=c(1,2,1,2)), par(pars))

for(iteration in 2:100){
        par(par1)
        points(iteration, x[iteration])
        par(par2)
        segments(iteration-1, mean(x[1:iteration-1]), iteration, mean(x[1:iteration]))
    }

左侧的散点图代表模拟的当前状态,右侧的折线图代表我想要监控的参数图。

这个解决方案非常有用。但我不能使用layout()或split.screen()的一些很酷的面板格式化功能,我似乎无法弄清楚如何重绘其中一个面板 - 例如,想象一下,我想在右侧窗口中跟踪x的运行平均值,从1到10,然后在迭代11用xlim = c(1,100)重绘窗口,绘制运行方式从1到11,并继续添加段迭代100.我似乎无法得到R,也许(?)因为坐标系不能重置?

有更好的(最佳?)方式吗?提前谢谢。

0 个答案:

没有答案