Расположение виджетов в ipywidgets интерактивно

У меня есть этот код интерактивного графика с использованием ipywidgets; но не уверен, как организовать каждую переменную внутри интерактивной функции в виджетах. макет по умолчанию является вертикальным. Но я хочу расположить их горизонтально.

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.style.use('seaborn')
%config InlineBackend.figure_format = 'svg'
from ipywidgets import interactive,interact
#function to plot the different curves
def plot_function(u=1,v=2,w=3,x=4,y=5,z=6):
    time=np.arange(0,1,0.01)
    df=pd.DataFrame({"Y1":np.sin(time*u*2*np.pi),"y2":np.sin(time*v*2*np.pi),"y3":np.sin(time*w*2*np.pi),
                    "y4":np.sin(time*x*2*np.pi),"y5":np.sin(time*y*2*np.pi),"y6":np.sin(time*z*2*np.pi)})
    df.plot()
widget=interactive(plot_function,u=1,v=2,w=3,x=4,y=5,z=6)
widget

Выход

3 ответа

Решение

interactive ограничен довольно простыми макетами виджетов. Посмотрите на параметры Flexbox, если вы хотите настроить их еще немного.

Один простой способ обойти это использовать interactive вызов для создания и связывания ваших виджетов и функций, а затем реструктурировать виджеты внутри HBox. Затем добавьте компоновку, которая говорит окну переноситься в конце строки. Я добавил еще пару импортов и три строки в конце, чтобы добиться этого.

1) controls - ан HBox из ваших входных виджетов.

2) Output виджет, сгенерированный interactive вызов.

3) А VBox это оборачивает два вместе.

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.style.use('seaborn')
%config InlineBackend.figure_format = 'svg'
#importing the necessary items from the Ipywidgets library 
from ipywidgets import interactive,interact, HBox, Layout,VBox
#function to plot the different curves
def plot_function(u=1,v=2,w=3,x=4,y=5,z=6):
    time=np.arange(0,1,0.01)
    df=pd.DataFrame({"Y1":np.sin(time*u*2*np.pi),"y2":np.sin(time*v*2*np.pi),"y3":np.sin(time*w*2*np.pi),
                    "y4":np.sin(time*x*2*np.pi),"y5":np.sin(time*y*2*np.pi),"y6":np.sin(time*z*2*np.pi)})
    df.plot()
widget=interactive(plot_function,u=1,v=2,w=3,x=4,y=5,z=6)
controls = HBox(widget.children[:-1], layout = Layout(flex_flow='row wrap'))
output = widget.children[-1]
display(VBox([controls, output]))

введите описание изображения здесь

Привет, это декоратор, который я использую вместо @interact:

def interact_delayed(_InteractFactory__interact_f=None, **kwargs):
    def patch(obj):
        if hasattr(obj.widget, 'layout'):
            obj.widget.layout = Layout(flex_flow='row wrap')
        for child in obj.widget.children:
            if hasattr(child, 'continuous_update'):
                child.continuous_update = False
        return obj
    if _InteractFactory__interact_f is None:
        def decorator(f):
            obj = interact(f, **kwargs)
            return patch(obj)
        return decorator
    else:
        obj = interact(_InteractFactory__interact_f, **kwargs)
        return patch(obj)

В patch функция изменяет атрибуты по умолчанию объекта ipywidget: применяет макет, предложенный в предыдущем ответе, а также устанавливает continuous_updateна false, который я нашел полезным в своих случаях. Ветви if-else заботятся о сценариях использования декораторов и функций.

Невозможно упорядочить виджеты, добавив параметр в "взаимодействовать" или "интерактивно".

Другие вопросы по тегам