代码之家  ›  专栏  ›  技术社区  ›  vestland

Jupyter:如何使用widgets.selectmultiple()交互选择要绘制的系列?

  •  1
  • vestland  · 技术社区  · 6 年前

    背景:

    有人问了类似的问题 here ,但不是很具体,大多数回答只参考了其他来源。我的案件感觉很基本,我惊讶于找到这方面的工作实例有多困难。

    目标:

    我只想能够从熊猫数据框中选择任何子集,通过使用这样的小部件进行如下绘图:

    enter image description here

    我的尝试:

    这个 widgets.SelectMultiple() 小部件在 docs this section 描述如何以交互方式更改绘图中序列的值。我试图用 widgets.selectmultiple()。 但几乎没有成功。

    认为 我很快就要开始工作了,我 希望 我所要做的就是找出在标有 “怎么办!“ 在下面的片段中。正如现在的代码片段,小部件和图表被生成,但它们之间没有起作用的链接。

    我知道的问题:

    我对链接中提供的示例的复制有一些缺陷。我想 df widg 应该包括在 multiplot 功能。同样的情况也可能发生在 interactive plot 功能。我也尝试过不同的变化,但没有成功。

    片段(在Jupyter笔记本中使用):

    # imports
    %matplotlib inline
    
    from ipywidgets import interactive
    import pandas as pd
    import numpy as np
    from jupyterthemes import jtplot
    
    # Sample data
    np.random.seed(123)
    rows = 50
    dfx = pd.DataFrame(np.random.randint(90,110,size=(rows, 1)), columns=['Variable X'])
    dfy = pd.DataFrame(np.random.randint(25,68,size=(rows, 1)), columns=['Variable Y'])
    dfz = pd.DataFrame(np.random.randint(60,70,size=(rows, 1)), columns=['Variable Z'])
    
    df = pd.concat([dfx,dfy,dfz], axis = 1)
    #jtplot.style()
    
    import ipywidgets as widgets
    from IPython.display import display
    
    def multiplot():
        opts = df.columns.values
    
        widg = widgets.SelectMultiple(
               options=opts,
               value=[opts[1]],
               rows=len(opts),
               description='Variables',
               disabled=False)
    
        display(widg)
    
        # what to do!? 
        df.plot()
    
        #attempts:
        #df[widg].plot()
        #df[widg.value[0]].plot()
    
    interactive_plot = interactive(multiplot)
    output = interactive_plot.children[-1]
    output.layout.height = '350px'
    interactive_plot
    

    输出(有缺陷):

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  1
  •   ac24    6 年前

    谢谢你举的例子。不幸的是,我不确定selectmultiple是否可以按您的意愿使用。

    通常,对于交互调用,需要一个向其传递参数的函数。您不需要在函数体内部创建小部件, interact 调用应该理解从传递的参数需要什么类型的输入小部件。

    有关指定字符串选项列表的示例,请参见此处。( https://ipywidgets.readthedocs.io/en/stable/examples/Using%20Interact.html#Widget-abbreviations )

    我对您的代码做了一些小的修改,以生成一个与下拉选择器交互的产品。我怀疑如果你想使用selectmultiple而不是下拉列表,这已经超出了 交互作用 功能。您可能需要单独创建小部件,然后使用 observe .

    # imports
    %matplotlib inline
    
    from ipywidgets import interactive
    import pandas as pd
    import numpy as np
    # from jupyterthemes import jtplot
    
    # Sample data
    np.random.seed(123)
    rows = 50
    dfx = pd.DataFrame(np.random.randint(90,110,size=(rows, 1)), columns=['Variable X'])
    dfy = pd.DataFrame(np.random.randint(25,68,size=(rows, 1)), columns=['Variable Y'])
    dfz = pd.DataFrame(np.random.randint(60,70,size=(rows, 1)), columns=['Variable Z'])
    
    df = pd.concat([dfx,dfy,dfz], axis = 1)
    #jtplot.style()
    
    import ipywidgets as widgets
    from IPython.display import display
    
    def multiplot(a):
        opts = df.columns.values
        df.loc[:, a].plot()
    
    interactive_plot = interactive(multiplot, a=['Variable X', 'Variable Y', 'Variable Z'])
    output = interactive_plot.children[-1]
    output.layout.height = '350px'
    interactive_plot
    

    enter image description here

    这里有一个版本使用 观察 ,一个selectmultiple小部件和一个 Output 小装置:

    # imports
    %matplotlib inline
    
    from ipywidgets import interactive
    import pandas as pd
    import numpy as np
    from IPython.display import clear_output
    import matplotlib.pyplot as plt
    
    # Sample data
    np.random.seed(123)
    rows = 50
    dfx = pd.DataFrame(np.random.randint(90,110,size=(rows, 1)), columns=['Variable X'])
    dfy = pd.DataFrame(np.random.randint(25,68,size=(rows, 1)), columns=['Variable Y'])
    dfz = pd.DataFrame(np.random.randint(60,70,size=(rows, 1)), columns=['Variable Z'])
    
    df = pd.concat([dfx,dfy,dfz], axis = 1)
    #jtplot.style()
    
    import ipywidgets as widgets
    from IPython.display import display
    
    opts = df.columns.values
    
    selector = widgets.SelectMultiple(
    options=opts,
    value=[opts[1]],
    rows=len(opts),
    description='Variables',
    disabled=False)
    
    output = widgets.Output()
    
    display(selector)
    display(output)
    
    def multiplot(widg):
        choices = widg['new']
        data = df.loc[:, choices]
        output.clear_output(wait=True)
        with output:
            ax = data.plot()
            plt.show()
    
    selector.observe(multiplot, names='value')
    

    enter image description here