Как автоматически закрыть фигуру в конце анимации? - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь отобразить базовую анимацию, используя Python и Matplotlib, через animation.FuncAnimation(). Анимация не повторяется и состоит из фиксированного (и предварительно определенного) количества кадров с некоторым фиксированным интервалом между ними. Он предназначен для запуска один раз.

Вот как должен выглядеть один случайный кадр: random frame

Анимация работает нормально, но фигура не закрывается автоматически после вызова plt.show(), поскольку это блокирующий вызов.

Я знаю, что метод plt.show() можно превратить в неблокирующий вызов, написав plt.show(block=False), но это не полностью решает мою проблему. У меня не было возможности получить какую-либо информацию здесь, на StackOverflow и других сайтах, относительно того, как библиотека располагает этой информацией об этом событии или около того, чтобы позволить мне позвонить plt.close().

Я ищу питонский способ сделать это вместо моего текущего решения, которое далеко не хорошо. Вот мое «решение»:

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. Может кто-нибудь показать мне питонский способ сделать это?
  2. Я все это делаю неправильно?

1 Ответ

2 голосов
/ 02 мая 2019

Может быть, вы хотите использовать функцию анимации, чтобы решить, когда закрыть фигуру.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...