Я не могу найти простой и быстрый способ построения последовательностей изображений с помощью простого matplotlib в блокноте Jupyter. Я пробовал FuncAnimation, fig.canvas.draw (), blitting, а также просто стандартную комбинацию imshow-pause;без успеха или с очень медленной частотой обновления. Мне не нужно, чтобы изображения были интерактивными - они просто должны отображаться последовательно и не могут отображать новое окно рисунка для каждого изображения. Я видел здесь много решений, но ни одно из них не работает так, как я хочу.
Мой общий конвейер выполняет значительную обработку, каждое изображение генерируется и отображается в цикле while или for. 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()