背景:
我正在运行蒙特卡罗模拟,以显示特定过程(累积平均值)不随时间收敛,并且在模拟中经常出现偏差(随机变量的期望=无限远) )。我想在折线图上绘制大约10个这样的模拟,其中x轴具有迭代次数,y轴具有直到该点的累积平均值。
以下是我的问题:
我将运行第一个模拟(每个模拟器,有10,000次迭代),并根据其当前范围构建主图。但是,通常其中一个模拟的范围比第一个范围大几个数量级,因此情节会超出原始范围。那么,有没有办法在添加一组新的点或线时动态更新图的ylim或xlim?
我可以为此考虑两个变通方法:1。存储每个模拟,然后选择范围最大的模拟,并构建基本图形(不优雅,我会必须在内存中存储大量数据,但可能是笔记本电脑友好的 [[编辑:正如Marek所指出的,这不是一个记忆密集的例子,但如果你知道一个很好的解决方案,那就支持更多的迭代使它成为一个问题(想想高维行走需要更多,更大的MC样本进行收敛)然后直接进入]] )2。找到一个似乎构建一个漂亮的版本的种子它,并手动设置ylim,这将使演示可重现。
当然,我正在坚持比我的解决方案更优雅的东西。希望这不是一个行人问题,因为我想在R中的模拟并不少见。任何想法?
答案 0 :(得分:5)
我不确定使用基本图形是否可行,如果有人有解决方案,我很乐意看到它。但是,基于网格(lattice和ggplot2)的图形系统允许保存和更新图形对象。在ggplot2中这很容易。
require(ggplot2)
制作一些数据并获得范围:
foo <- as.data.frame(cbind(data=rnorm(100), numb=seq_len(100)))
制作一个初始的ggplot对象并绘制它:
p <- ggplot(as.data.frame(foo), aes(numb, data)) + layer(geom='line')
p
制作更多数据并将其添加到情节
foo <- as.data.frame(cbind(data=rnorm(200), numb=seq_len(200)))
p <- p + geom_line(aes(numb, data, colour="red"), data=as.data.frame(foo))
绘制新对象
p
答案 1 :(得分:0)
我认为(1)是最好的选择。我实际上并不认为不是优雅。我认为每次达到大于xlim或ylim的点时重绘都会计算量更大。
另外,我在Peter Hoff关于贝叶斯统计的书中看到了ts()而不是line()用于累积和/手段的很好用法。它看起来很漂亮: