如何在动画结束时自动关闭图形?

时间:2019-05-01 21:01:43

标签: python matplotlib

我正在尝试通过animation.FuncAnimation()使用Python和Matplotlib显示基本动画。动画非重复,由固定(和预定义)数量的帧组成,帧之间间隔一定的固定间隔。它只能运行一次。

以下是单个随机帧的外观: random frame

动画运行得很好,但是由于调用是plt.show(),因此该图形不会自动关闭。

我知道可以通过编写plt.show()来使方法plt.show(block=False)成为非阻塞调用,但这不能完全解决我的问题。我无法在StackOverflow和其他站点上获得任何有关该库如何处置此事件信息的信息,以便允许我致电plt.close()。 / p>

我正在寻找一种实现此目标的Python方式,而不是我目前的解决方案,这远非好事。这是我的“解决方案”:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

# Animation settings
def animate(frame):
    grid_size = [10, 10]
    print('frame: {}'.format(frame)) # Debug: May be useful to stop
    grid = np.random.randint(low=0, high=256, size=grid_size, dtype=np.uint8)
    ax.clear()
    ax.imshow(grid, cmap='gray', vmin=0, vmax=255) # Is the range [0, 255] or [0, 255)?

INTERVAL = 100
FRAMES_NUM = 10

anim = animation.FuncAnimation(fig, animate, interval=INTERVAL, frames=FRAMES_NUM, repeat=False)

plt.show(block=False)
plt.pause(float(FRAMES_NUM*INTERVAL)/1000) # Not pythonic
plt.close(fig)
  1. 有人可以告诉我一种执行此操作的pythonic方法吗?
  2. 我全部都在做吗 错误吗?

2 个答案:

答案 0 :(得分:2)

也许您想使用动画功能来决定何时关闭图形。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

grid_size = [10, 10]
grid = np.random.randint(low=0, high=256, size=grid_size, dtype=np.uint8)
im = ax.imshow(grid, cmap='gray', vmin=0, vmax=255)

# Animation settings
def animate(frame):
    if frame == FRAMES_NUM:
        print(f'{frame} == {FRAMES_NUM}; closing!')
        plt.close(fig)
    else:
        print(f'frame: {frame}') # Debug: May be useful to stop
        grid = np.random.randint(low=0, high=256, size=grid_size, dtype=np.uint8)
        im.set_array(grid)

INTERVAL = 100
FRAMES_NUM = 10

anim = animation.FuncAnimation(fig, animate, interval=INTERVAL, 
                               frames=FRAMES_NUM+1, repeat=False)

plt.show()

答案 1 :(得分:0)

在你的动画函数中使用 plt.close()
例如,如果您绘制的最后一帧是 iFrame = 9
然后:

if iFrame == 9:
    plt.close()