Как вы обновляете встроенные изображения в Ipython?

Редактировать: Мой вопрос не касается «анимации» как таковой. Мой вопрос здесь просто о том, как постоянно показывать новое встроенное изображение в цикле for, в блокноте Ipython.

По сути, я хотел бы показать обновленное изображение в том же месте, встроенное, и обновить его в цикле для отображения. Итак, мой код в настоящее время выглядит примерно так:

import numpy as np
import matplotlib
import matplotlib.pyplot as plt
from IPython import display
%matplotlib inline  

fig, ax = plt.subplots(nrows = 1, ncols = 1, figsize=(10, 10))
for ii in xrange(10):
    im = np.random.randn(100,100)
    ax.cla()
    ax.imshow(im, interpolation='None')
    ax.set_title(ii)
    plt.show()

Проблема в том, что в настоящее время это просто... ну, показывает первое изображение, а затем оно никогда не меняется.

Вместо этого я хотел бы просто показывать обновленное изображение на каждой итерации, встроенное, в одном и том же месте. Как я могу это сделать? Спасибо.


person TheGrapeBeyond    schedule 05.11.2017    source источник
comment
Выполняя это, я получаю: ax[0].cla(): TypeError: 'AxesSubplot' object does not support indexing   -  person bastelflp    schedule 05.11.2017
comment
@bastelflp Извините, попробуйте сейчас.   -  person TheGrapeBeyond    schedule 05.11.2017
comment
Я не верю, что это дубликат, так как это относится к массивам numpy, отображаемым в цикле. Это не имеет ничего общего с анимацией как таковой.   -  person TheGrapeBeyond    schedule 06.11.2017
comment
Строки matplotlib.use('TkAgg') и %matplotlib inline конфликтуют, поскольку относятся к разным бэкендам. Вам нужно встроенное изображение или отдельное окно?   -  person Pierre de Buyl    schedule 07.11.2017
comment
@PierredeBuyl Хороший вопрос. Я хотел бы обновить встроенное изображение.   -  person TheGrapeBeyond    schedule 07.11.2017
comment
Я не уверен, что вы можете сделать это без анимации. Блокноты фиксируют выходные данные matplotlib, чтобы включить их в ячейку после завершения построения графика. Структура анимации довольно общая и охватывает все, что не является статическим изображением. matplotlib.animation.FuncAnimation, вероятно, подойдет что ты хочешь.   -  person Pierre de Buyl    schedule 07.11.2017
comment
@PierredeBuyl Спасибо, не могли бы вы написать ответ, и тогда я смогу его принять? Спасибо!   -  person TheGrapeBeyond    schedule 10.11.2017


Ответы (2)


Вы можете вызывать figure.canvas.draw() каждый раз, когда добавляете что-то новое к фигуре. Это обновит график (от здесь). Пытаться:

import numpy as np
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from IPython import display
from time import sleep

fig = plt.figure()
ax = fig.gca()
fig.show()

for ii in range(10):
    im = np.random.randn(100, 100)
    plt.imshow(im, interpolation='None')
    ax.set_title(ii)
    fig.canvas.draw()
    sleep(0.1)

Однако я не смог проверить это на ноутбуке IPython.

person bastelflp    schedule 05.11.2017
comment
Спасибо, но это не работает на Ipython. Здесь он просто обрабатывает и отображает последнее изображение. - person TheGrapeBeyond; 05.11.2017

Я не уверен, что вы можете сделать это без анимации. Блокноты фиксируют выходные данные matplotlib, чтобы включить их в ячейку после завершения построения графика. Структура анимации довольно общая и охватывает все, что не является статическим изображением. matplotlib.animation.FuncAnimation, вероятно, подойдет что ты хочешь.

Я адаптировал ваш код следующим образом:

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

f = plt.figure()
ax = f.gca()

im = np.random.randn(100,100)
image = plt.imshow(im, interpolation='None', animated=True)

def function_for_animation(frame_index):
    im = np.random.randn(100,100)
    image.set_data(im)
    ax.set_title(str(frame_index))
    return image,

ani = matplotlib.animation.FuncAnimation(f, function_for_animation, interval=200, frames=10, blit=True)

Примечание. Чтобы %matplotlib notebook вступило в силу, необходимо перезапустить блокнот и использовать серверную часть, поддерживающую анимацию.

РЕДАКТИРОВАТЬ: Обычно есть способ, который ближе к вашему первоначальному вопросу, но на моем компьютере возникают ошибки. В примере animation_demo есть простой цикл for с оператором plt.pause(0.5), который должен также работать.

person Pierre de Buyl    schedule 10.11.2017