Быстрые последовательности изображений / анимация в Jupyter Notebook с matplotlib - PullRequest
1 голос
/ 02 октября 2019

Я не могу найти простой и быстрый способ построения последовательностей изображений с помощью простого 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()

1 Ответ

0 голосов
/ 02 октября 2019

Я думаю, что проблема в том, что участки «застраиваются», поэтому каждый из них строится каждый раз. Если вы добавите ax.clear() прямо перед imshow(), вы получите время линейного графика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...