【问题标题】:ipywidgets: how to organize sliders in two columnsipywidgets:如何在两列中组织滑块
【发布时间】:2017-08-01 14:12:35
【问题描述】:

我正在尝试研究如何在两列(或更多列)中显示 ipywidgets 的滑块。有没有人有一个例子如何做到这一点?我的代码(在 jupyter notebook 中)现在如下:

import matplotlib.pylab as plt
import numpy as np
from ipywidgets import interact,FloatSlider,IntSlider
%matplotlib inline
def plotPP(p,p_LP,Tperiods):
    t=np.linspace(0,Tperiods*(np.pi*2),1000)
    f = plt.figure(figsize=(1.618*6,6))
    p_t = p*(1.0+np.cos(t))
    plt.plot(t,p_t,'b',lw=2.0)
    plt.axhline(p_LP,color='r',lw=2.0)
    plt.xlim([t[0],t[-1]])
    plt.ylim([min(p_LP,np.amin(p_t))-0.1,np.amax(p_t)+0.1])
    plt.ylabel(r'$p$')
    plt.xlabel(r'$t$')

p_s       = FloatSlider(min=0, max=2, step=0.01, value=1.0)
p_LP_s    = FloatSlider(min=0, max=2., step=0.01, value=0.481343)
Tperiods_s= IntSlider(min=1,max=10,value=1)
interact(plotPP,p=p_s,p_LP=p_LP_s,Tperiods=Tperiods_s)

它显示三个滑块一个在另一个之上:

【问题讨论】:

    标签: python-2.7 widget jupyter-notebook jupyter ipywidgets


    【解决方案1】:

    还有另一种方法可以水平放置滑块并在不移动滑块的情况下立即查看图表

    from IPython.display import display
    import matplotlib.pylab as plt
    import numpy as np
    from ipywidgets import FloatSlider, IntSlider, interactive_output, HBox
    %matplotlib inline
    
    def plotPP(p,p_LP,Tperiods):
        t=np.linspace(0,Tperiods*(np.pi*2),1000)
        f = plt.figure(figsize=(1.618*6,6))
        p_t = p*(1.0+np.cos(t))
        plt.plot(t,p_t,'b',lw=2.0)
        plt.axhline(p_LP,color='r',lw=2.0)
        plt.xlim([t[0],t[-1]])
        plt.ylim([min(p_LP,np.amin(p_t))-0.1,np.amax(p_t)+0.1])
        plt.ylabel(r'$p$')
        plt.xlabel(r'$t$')
    
    p_s       = FloatSlider(min=0, max=2, step=0.01, value=1.0)
    p_LP_s    = FloatSlider(min=0, max=2., step=0.01, value=0.481343)
    Tperiods_s= IntSlider(min=1,max=10,value=1)
    

    区别就在这里:

    out = interactive_output(plotPP, {'p': p_s, 'p_LP': p_LP_s})
    display(HBox([p_s, p_LP_s]), out)
    

    【讨论】:

    • 很好的解决方案!您将如何使用滑块打印标签?
    • @thad 如果您还没有找到解决方案,您可以在声明 Slider 时添加 description 参数。例如,FloatSlider(descrition='p_s', min=0, max=2, step=0.01, value=1.0) 将显示 p_s 作为滑块的标签。
    【解决方案2】:

    有几个你可以根据你想做什么来完成这个。他们最容易想到的是使用interactive 而不是interact 以及HBoxIPython.display.display。这个解决方案唯一的问题是,您可能必须在看到图表之前开始移动 silders。

    from IPython.display import display
    import matplotlib.pylab as plt
    import numpy as np
    from ipywidgets import interact,FloatSlider,IntSlider,interactive,HBox
    %matplotlib inline
    def plotPP(p,p_LP,Tperiods):
        t=np.linspace(0,Tperiods*(np.pi*2),1000)
        f = plt.figure(figsize=(1.618*6,6))
        p_t = p*(1.0+np.cos(t))
        plt.plot(t,p_t,'b',lw=2.0)
        plt.axhline(p_LP,color='r',lw=2.0)
        plt.xlim([t[0],t[-1]])
        plt.ylim([min(p_LP,np.amin(p_t))-0.1,np.amax(p_t)+0.1])
        plt.ylabel(r'$p$')
        plt.xlabel(r'$t$')
    
    p_s       = FloatSlider(min=0, max=2, step=0.01, value=1.0)
    p_LP_s    = FloatSlider(min=0, max=2., step=0.01, value=0.481343)
    Tperiods_s= IntSlider(min=1,max=10,value=1)
    
    ip = interactive(plotPP,p=p_s,p_LP=p_LP_s,Tperiods=Tperiods_s)
    display(HBox(ip.children[:-1]))#Show all controls
    display(ip.children[-1])#Show the output
    

    如果不清楚或不适合您,请在下方评论。

    【讨论】:

    • 完美运行!但我想知道是否还有一种方法可以使用interact 方法,这样就不需要使用display..
    • 很高兴听到。在不使用display 命令的情况下也可以做到这一点,最终它会更复杂,并且会涉及到link 和/或observe 命令,您可以阅读这些here
    猜你喜欢
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    • 2019-02-18
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多