有效地更新几个pyplots

时间:2017-04-27 06:19:56

标签: python matplotlib plot

我有一个脚本,应该在for循环的每次迭代中更新25个图像的网格。代码本质上就是这个(我省略了无关紧要的东西以保持简单):

from matplotlib import pyplot as plt
plt.ion()
fig, ax = plt.subplots(5,5,figsize=(3,3))

for i in range(100):
    updateImages()
    for j in range(5):
         for k in range(5):
              ax[j,k].imshow(image[j,k])
    plt.draw()
    plt.pause(0.01)

问题是它非常非常缓慢地运行[并且不是updateImages()不是很慢]。我相信有一种更有效的方法可以做到这一点,但到目前为止,我一直无法找到任何例子。建议将非常感谢!

1 个答案:

答案 0 :(得分:2)

你的程序在一段时间后运行缓慢的原因可能是你只是在总是调用imshow而不是替换/更新时数据点添加到图中

相反,您可以将imshow的第一个输出存储在列表中,只需更新数据。首先,创建一个与list_of_images具有相同“形状”的列表ax,并将第一次迭代的图像存储在那里:

list_of_images[j,k] = imshow(...)

然后在迭代循环中,只需更新数据:

list_of_images[j,k].set_data(image[j,k])

这样,Python必须处理的数据量不随迭代次数增加而且程序应该稳定。

编辑(OP):根据这个答案,我尝试了以下内容:

from matplotlib import pyplot as plt
plt.ion()
fig, ax = plt.subplots(5,5,figsize=(3,3))
image_grid = ax.copy()  # Maybe there is a less awkward way to do this

for i in range(100):
    updateImages()
    for j in range(5):
         for k in range(5):
              image_grid[j,k].set_data(image[j,k])
    plt.draw()
    plt.pause(0.01)

它运行非常流畅(与单个图像一样快)。谢谢!