在ipywidgets交互式界面中排列小部件

9

我有一个使用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

Output

3个回答

18

interactive只能用于相对简单的小部件布局。如果您想要更多自定义选项,请查看Flexbox选项。

一个简单的解决方法是使用interactive调用来生成并链接您的小部件和函数,然后在HBox中重新构造小部件。然后添加一个布局,告诉框在行末换行。我在结尾添加了几个导入和三行代码以实现这一点。

1)controls - 输入小部件的HBox

2)由interactive调用生成的Output小部件。

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]))

输入图像描述


不客气,如果你对答案满意的话,考虑点击左边的勾选按钮接受它。 - ac24
能否在执行此单元格时调用plot_function,而不是在操作小部件后调用? - Bananach
不是这样的,通常执行 display(widget) 会运行函数一次,但使用 vBox 方法意味着函数不会被运行。 - ac24
你可以使用widget.update()来获取显示输出。 - Gilles
你可以使用 widget.update() 来获取显示输出 - undefined

1

嗨,这是我使用的修饰器,而不是@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分支处理装饰器与函数用例场景。


0

无法通过在“interact”或“interactive”中添加参数来排列小部件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接