【问题标题】:R: update plot [xy]lims with new points() or lines() additions?R:用新的点()或线()添加更新图[xy]lims?
【发布时间】:2010-12-01 07:55:26
【问题描述】:

背景:

我正在运行蒙特卡洛模拟,以表明特定过程(累积平均值)确实随着时间的推移收敛,并且在模拟中经常发散很大(随机变量的期望 = 无穷大)。我想在折线图上绘制大约 10 个这样的模拟,其中 x 轴具有迭代次数,y 轴具有直到该点的累积平均值。

这是我的问题:

我将运行第一个模拟(每个模拟有 10,000 次迭代),并根据其当前范围构建主图。但通常其中一个模拟的范围比第一个大几个数量级,因此情节超出了原始范围。那么,有没有办法在添加一组新的点或线时动态更新绘图的 ylim 或 xlim?

我可以为此想到两个解决方法:1. 存储每个模拟,然后选择具有最大范围的一个,并以此构建基础图(不优雅,我会必须在内存中存储大量数据,但可能对笔记本电脑友好更多的迭代使得它成为一个问题(想想需要更多、更大的 MC 样本来收敛的高维游走,然后直接跳进去]]) 2. 找到一个看起来可以构建一个漂亮版本的种子它,并手动设置 ylim,这将使演示可重现。

我自然会坚持一些比我的解决方法更优雅的东西。希望这不是太普通的问题,因为我想这在 R 中的模拟中并不少见。有什么想法吗?

【问题讨论】:

  • 我只是想知道:你有任何记忆问题吗? 10.000 的 10 个向量并不多。当我检查时: X
  • 不,好点子 - 我绝对不会在这个模拟中遇到内存问题(因此对笔记本电脑友好),但我将演示更复杂的 [Q]MC[MC] 模拟未来,具有相同的图形输出。我正在寻找通常不会依赖太多存储的东西,尤其是当事情变得更加复杂并且我需要更大的 MC 样本大小来确保收敛时。这可能是不可避免的/我可能高估了实现上述未来模拟的难度。

标签: r plot


【解决方案1】:

我认为 (1) 是最好的选择。我实际上不认为这优雅。我认为每次达到大于 xlim 或 ylim 的点时重绘会更加计算密集。

此外,我在 Peter Hoff 的有关贝叶斯统计的书中看到,使用 ts() 而不是 lines() 来计算累积和/均值很酷。它看起来很漂亮:

【讨论】:

  • 使用基本图形且内存更轻的解决方案是跟踪 X 和 Y 最大值。然后将完整的数据集保存到文件中。当您完成新的运行时,如果范围较大,请重做绘图,然后遍历存储的数据文件。
  • 不是在每次试验后检查(并最终重新绘制),而是可以保存数据并存储范围,然后找到全局范围,将其用作 ylim 并绘制结果(第一次)。
  • 我支持这种方法的部分原因是 Marek 在上面的评论,即这不是 那么多 数据。 7MB 内存。与我最近看到的基因组组装内存要求相比,MCMC 模拟程序简直是杯水车薪!
  • 是的 - 这个例子不需要我担心内存问题,即使是在一台蹩脚的笔记本电脑上。让我们看看当我带来一条更大的鱼时你们都说什么:)
【解决方案2】:

我不确定这是否可以使用基本图形,如果有人有解决方案,我很乐意看到它。然而,基于网格(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

【讨论】:

  • 这是一个很好的解决方案,证明我需要更多地使用 ggplot2。在第二个 foo 分配中使用 rnorm(200, 0, 1000) 确实表明这很有效:-)
  • 现在我想多了,如果存在内存问题,这将无济于事(所有 ggplot 对象数据都必须存在于某个地方。)
  • 鉴于这个特定的上下文(简单、简短的模拟),使用 ggplot 是最好的方法。事实上,由于其他原因,ggplot2 非常好,所以在我的书中使用它的答案是可以的。如果 .当记忆成为问题时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 2013-09-25
  • 1970-01-01
相关资源
最近更新 更多