高效地更新多个pyplot

2024-09-24 22:24:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个脚本,它应该在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()慢]。我相信有一个更有效的方法来做到这一点,但到目前为止,我还没有找到任何例子。建议将不胜感激


Tags: 代码infrom图像import脚本网格for
1条回答
网友
1楼 · 发布于 2024-09-24 22:24:48

程序在一段时间后运行缓慢的原因可能是,当总是调用imshow而不是替换/更新数据点时,您只是将数据点添加到绘图中。尽管您总是只能看到最近绘制的点,但Python必须在大量循环之后处理大量数据,这就是它变得缓慢的原因

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

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

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

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

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


编辑(按操作):基于这个答案,我尝试了以下方法:

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)

它运行得非常平稳(和单个图像一样快)。谢谢

相关问题 更多 >