【问题标题】:How to create indefinite funcanimation frames dynamically updating in real time?如何创建实时动态更新的无限动画帧?
【发布时间】:2024-01-05 05:28:02
【问题描述】:

我正在尝试在 python 中重新创建 a population variance graph

在那个例子中,一旦我们开始,函数立即运行到我猜测网站设置的环境限制。

我已经设法创建了类似的图表,但是对于动画我卡住了。下面是我的代码。

import matplotlib.animation as animation

fig, ax = plt.subplots(1,1,figsize=(5,4))
plt.close()

frameRate = 30

global_counter = 0

def animate(i):

    ax.clear()

    global global_counter

    ax.text(0.5,0.5, 'test:{}'.format(global_counter))
    global_counter += 1


ani = animation.FuncAnimation(fig, animate, np.arange(1,1000), interval=frameRate)

plt.tight_layout()
from IPython.display import HTML
HTML(ani.to_html5_video())

输出:

问题是,执行时间与次数成正比,然后生成图。因此,如果 1000 以上或更多,则在生成图形之前需要相当长的时间。看起来它在输出图形之前生成了所有 1000 帧。这样我至少需要 20000 帧。相反,只要网站打开或在不影响编译时间的情况下达到上限,它就应该是实时和更新的。

下一个问题是,在 1000 之后,计数器重新开始。全球计数器不应该继续增加吗?

我想要

  1. 程序立即启动,然后像我引用的示例一样动态更新。
  2. 程序在帧计数结束后继续增加计数器或不重置变量。如果不是 matplotlib、seaborn 或 plotly 或任何其他库可以在这里提供帮助吗?

我在ipython notebook(anaconda 环境)中使用 Python 3.x。

【问题讨论】:

    标签: python python-3.x matplotlib animation frame


    【解决方案1】:

    ani.to_html5_video() 创建一个文件。要创建此文件,需要提前知道所有帧。因此动画会完整运行一次,然后将这些帧保存并转换为 html5 视频。

    如果你想实时观看动画,你可以使用%matplotlib notebook后端而不保存动画。

    至于 1000 帧,您将在第三个参数中自己设置该数字为 FuncAnimationnp.arange(1,1000)。删除该参数或在此处选择不同的数字,例如frames =20000.

    【讨论】:

    • 太好了,这似乎解决了它,即使我将帧限制设置为 100,全局计数器也会增加。左上角有一个开关可以终止动画,但重启的唯一方法是再次运行代码。我将把它导出为 html 文件,因为阅读器将无法运行代码,(但我猜可以与图形交互),我们如何避免这种情况?
    • 如果导出html,没有实时取景选项;在这种情况下,您可以退回到之前的导出 html5 视频的解决方案。
    • 不可能生成等效的 js 脚本来重做针对特定输出 ipython 单元发生的实时视图更新?
    • 我不知道。这在概念上很困难:您的代码在 python 中。为了在没有该 python 代码的情况下生成相同的输出,您需要将所有代码转换为 javascript 并让它运行。没有 Python2JS 转换器。然而,有些项目试图从 JavaScript 中运行 python。我做例如知道WebAssembly