使用matplotlib在Jupyter笔记本电脑中快速生成图像序列/动画

使用matplotlib在Jupyter笔记本电脑中快速生成图像序列/动画,matplotlib,animation,jupyter-notebook,Matplotlib,Animation,Jupyter Notebook,我似乎找不到在Jupyter笔记本中用普通matplotlib绘制图像序列的简单而快速的方法。我尝试过FuncAnimation、fig.canvas.draw()、blitting,以及标准的imshow暂停组合;没有成功或刷新速度非常慢。我不需要图像是交互式的-他们只需要按顺序显示,不能为每个图像弹出一个新的图形窗口。我在这里看到了很多解决方案,但似乎没有一个能按我想要的方式工作 我的通用管道进行了重要的处理,在一段时间或一个循环内生成并绘制每个图像。FuncAnimation是不可取的,因

我似乎找不到在Jupyter笔记本中用普通matplotlib绘制图像序列的简单而快速的方法。我尝试过FuncAnimation、fig.canvas.draw()、blitting,以及标准的imshow暂停组合;没有成功或刷新速度非常慢。我不需要图像是交互式的-他们只需要按顺序显示,不能为每个图像弹出一个新的图形窗口。我在这里看到了很多解决方案,但似乎没有一个能按我想要的方式工作

我的通用管道进行了重要的处理,在一段时间或一个循环内生成并绘制每个图像。FuncAnimation是不可取的,因为它需要传递一个函数句柄,并且我的用例涉及许多参数和状态变量,这使得它很难使用

我得到的最好的例子是下面使用fig.canvas.draw()的工作示例-显示每次迭代的绘图时间线性增加,我需要它保持不变

import numpy as np
import matplotlib.pyplot as plt
from timeit import default_timer as timer
%matplotlib notebook

num_iters = 50
im = np.arange(60).reshape((15,4))

fig, ax = plt.subplots(1,1)
fig.show()
fig.canvas.draw()

iter_times = np.zeros(num_iters)
for i in range(num_iters):
    im = np.roll( a=im, shift=1, axis=0 )

    t0 = timer()
    ax.imshow(im.T, vmin=im.min(), vmax=im.max())
    ax.set_title('Iter # {}/{}'.format(i+1, num_iters))
    fig.canvas.draw()

    iter_times[i] = timer()-t0

plt.figure(figsize=(6,3))
plt.plot(np.arange(num_iters)+1, iter_times)
plt.title('Imshow/drawing time per iteration')
plt.xlabel('Iteration number')
plt.ylabel('Time (seconds)')
plt.tight_layout()
plt.show()

我认为问题在于这些图正在“积累”,所以每次都在绘制。如果在
imshow()
之前添加
ax.clear()
,则会得到线性绘图时间。

我认为问题在于绘图正在“累积”,因此每次都在绘图。如果您在
imshow()
之前添加
ax.clear()
,您将获得线性打印时间。

我发誓我以前已经尝试过了,但我想这个简化的示例不会。加快速度是另一个我认为在其他地方已经得到回答的问题。谢谢我以前看过以下内容,但需要一个纯matplotlib版本。我发誓我以前试过,但我想这个简单的例子是不行的。加快速度是另一个我认为在其他地方已经得到回答的问题。谢谢我以前看过以下内容,但需要一个纯matplotlib版本。