Управление макетом ipywidgets в блокноте jupyter - PullRequest
0 голосов
/ 25 октября 2019

У меня есть некоторые проблемы с пониманием того, как управлять flexbox ipywidgets в ноутбуке jupyter. В соответствии с docs это должно быть возможно, однако мой код стилевого оформления (см. Ниже) не приводит к желаемому макету. Я проверил в стеке и нашел хороший ресурс , который, кажется, работал там для людей, однако выполнение кода все равно не дает желаемого результата.

Проблема

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

from matplotlib.pyplot import subplots
from IPython.display import display
import ipywidgets as ipy
import numpy as np

# setup figure
n = 10
fig, ax = subplots(figsize = (5,5))
h = ax.imshow(np.random.rand(n, n))

# show random mesh
def update(idx):
    h.set_data(np.random.rand(n, n))
    fig.canvas.flush_events()
    fig.canvas.draw()
slider = ipy.IntSlider(min = 0, max = 10, orientation = 'vertical')
widget = ipy.interactive(update, idx = slider)

layout = ipy.Layout(display = 'flex',\
                   flex_flow = 'row',\
                   justify_content = 'space-between',\
                   align_items = 'center',\
                   )
widgets = ipy.HBox(widget.children[::-1], layout = layout)
display(widgets)

Однако это приводит к enter image description here

Как заставитькомпоновка горизонтальных столбцов с использованием ipywidgets в блокноте jupyter?

1 Ответ

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

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

from IPython.display import display, clear_output
import ipywidgets as ipy
import matplotlib.pyplot as plt
import numpy as np

# setup figure
n = 10

out = ipy.Output()

# show random mesh
def update(idx):
    with out:
        clear_output()
        fig, ax = plt.subplots(figsize = (5,5))
        h = ax.imshow(np.random.rand(n, n))
        h.set_data(np.random.rand(n, n))
        fig.canvas.flush_events()
        fig.canvas.draw()
        plt.show()

slider = ipy.IntSlider(min = 0, max = 10, orientation = 'vertical')
widget = ipy.interactive(update, idx = slider)

layout = ipy.Layout(
#     display = 'flex',
#                    flex_flow = 'row',
#                    justify_content = 'space-between',
#                    align_items = 'center',
                   )
widgets = ipy.HBox(children=(slider, out), layout = layout)
display(widgets)

enter image description here

...