Получить блокнот Jupyter для отображения фигур Matplotlib в режиме реального времени - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть длительный цикл Python (используется для машинного обучения), который периодически печатает выходные данные и отображает цифры (используя matplotlib).При запуске в Jupyter Notebook весь текст (stdout) отображается в режиме реального времени, но все рисунки ставятся в очередь и не отображаются, пока не завершится весь цикл.

Я бы хотел видеть цифры вв режиме реального времени, на каждой итерации цикла.Во время выполнения ячейки, а не тогда, когда завершено выполнение всей ячейки.

Например, если мой код:

for i in range(10):
  print(i)
  show_figure(FIG_i)
  do_a_10_second_calculation()

В настоящее время я вижу:

0
1
2
...
9
FIG_0
FIG_1
...
FIG_9

ЧтоМне бы хотелось, чтобы это было:

0
FIG_0
1
FIG_1
2
FIG_2
...

Самое главное, я хотел бы видеть цифры в том виде, в каком они рассчитаны, в отличие от того, чтобы не видеть никаких фигур на экране, пока не закончится весь цикл.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

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

%matplotlib inline

import matplotlib.pyplot as plt

def do_a_1_second_calculation():
    plt.pause(1)

def show_figure(i):
    plt.figure(i)
    plt.plot([1,i,3])
    plt.show()

for i in range(10):
    print(i)
    show_figure(i)
    do_a_1_second_calculation()

приводит к желаемому результату

enter image description here

0 голосов
/ 23 ноября 2018

Функция display из IPython.display может быть использована для немедленного сброса фигуры на выход ячейки.Предполагая, что FIG_i в вашем коде является фактическим объектом фигур Matplotlib, вы можете просто заменить show_figure(FIG_i) на display(FIG_i), и цифры будут выводиться в реальном времени.

Вот полный пример display вдействие:

from matplotlib import pyplot as plt
import numpy as np
from IPython.display import display
from time import sleep

for eps in range(0, 11, 5):
    data = np.random.randint(eps, eps+10, size=(2,10))

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

    ax.plot(*data)

    print('eps %f' % eps)
    display(fig)
    plt.close()    # .close prevents the normal figure display at end of cell execution

    sleep(2)
    print('slept 2 sec')

Вот снимок экрана с выводом:

enter image description here

...