【问题标题】:Arranging widgets in ipywidgets interactive在 ipywidgets 交互中排列小部件
【发布时间】:2019-03-29 13:14:49
【问题描述】:

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

【问题讨论】:

    标签: python-3.x jupyter-notebook interactive ipywidgets


    【解决方案1】:

    没有办法通过在“交互”或交互中添加参数来排列小部件。

    【讨论】:

      【解决方案2】:

      您好,这是我使用的装饰器,而不是 @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 分支负责装饰器与函数用例场景。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 不客气,如果您对答案感到满意,请考虑点击左侧的勾号接受它。
        • 是否可以在执行此单元格时调用 plot_function,而不是在第一次操作小部件后调用?
        • 不要这么认为,正常情况下display(widget)会运行一次函数,但是使用vBox方式意味着函数不会运行。
        猜你喜欢
        • 2016-10-03
        • 1970-01-01
        • 1970-01-01
        • 2019-12-15
        • 2021-10-19
        • 1970-01-01
        • 2021-04-26
        • 2020-09-01
        • 2023-02-05
        相关资源
        最近更新 更多