13 August 2020

Юпитер и интерактивность: matplotlib наносит отетный удар

Ранее в посте Юпитер и интерактивность - темная строна я указал, что в простом случае matplotlib не работает нормально интерактивно. Однако чтобы это вернуть достаточно установить ipympl. Чтобы с гарантией это было в Юпитере - ставим через конду:

conda install -c conda-forge ipympl

Теперь это есть в системе:

Берем код из ранее упомянутого примера и добавляем в самое начало немного магии:

%matplotlib widget

А далее создаем два ползунка и кнопку, которая будет обрабатывать нажатие:

button = widgets.Button(description='My Button')

sF = widgets.FloatSlider(
         value=1,
         min=0,
         max=10.0,
         step=0.1,)
sPhase = widgets.FloatSlider(
         value=1,
         min=0,
         max=10.0,
         step=0.1,)


Теперь осталось сделать обработчик кнопки, привязать его к кнопке и разместить элементы. Для размещения я использую Vbox, то есть в нем элементы будут размещаться последовательно вертикально. Туда же в качестве виджета я помещаю и вывод - widgets.Output() :

outt = widgets.Output()

def on_butt_clicked(b):
    with outt:
        clear_output()
        global sF,sPhase
        plot_f(sF.value, sPhase.value)
       
button.on_click(on_butt_clicked)
widgets.VBox([sF, sPhase, button, outt ])


И вот теперь все начинает работать:

Меняем значение ползунка и еще раз нажимаем кнопку:

Как можно видеть, заголовок у графика поменялся с Figure 3 на Figure 4. Однако картинка осталась на месте, правильно отображенная и не стала клонироваться. Более того, как и в случае режима notebook, задаваемого магическими командами, у графика есть такая же панель инструментов, только слева, а не внизу.
Правда, если изменить масштаб/сдвинуть график, то после нажатия кнопки это все пропадет в силу того, что картинка полностью перерисовывается. Тем не менее путем доустановки отсутствующего в штатной комплктации ipympl можно использовать интерактивные возможности Юпитера и с matplotlib.

No comments:

Post a Comment