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

ves*_*and 6 python jupyter-notebook

背景:

一个类似的问题已经被问到这里,但不是很具体,而且大多只是通过参考其他来源来回答。我的案例感觉非常基本,我对找到这方面的工作示例有多么困难感到惊讶。

目标:

我只想能够从 Pandas 数据框中选择任何子集,通过使用这样的小部件来制作如下图:

在此处输入图片说明

我的尝试:

widgets.SelectMultiple()小部件在docs中进行了简要描述,本节描述了如何以交互方式更改图中系列的值。我试图用 的功能替换后一个演示的核心部分widgets.SelectMultiple(),但收效甚微。

我真的很接近让这个工作,我希望我所要做的就是找出在标记为“#做什么!?”的部分下写什么。在下面的片段中。就像现在的代码片段一样,生成了一个小部件和图表,但它们之间没有功能链接。

我所知道的问题:

我对链接中提供的示例的复制有一些缺陷。我认为df并且widg应该包含在multiplot函数中。interactive plot功能可能也是如此。我也尝试过不同的变体,但没有成功。

片段(在 Jupyter Notebook 中使用):

# 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
Run Code Online (Sandbox Code Playgroud)

输出(有缺陷):

在此处输入图片说明

ac2*_*c24 8

感谢您提供清晰的示例。不幸的是,我不确定 SelectMultiple 是否可以按照您想要的方式使用。

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

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

我对您的代码进行了一些小的改动,以便与下拉选择器进行交互。我怀疑如果您想使用 SelectMultiple 而不是 Dropdown,这超出了interact功能范围。您可能需要单独创建小部件,然后使用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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这是一个使用observe,一个 SelectMultiple 小部件和一个Output小部件的版本:

# 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
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


小智 6

我发现使用multipleSelect小部件的最简单方法是使用装饰器interact

%matplotlib inline
import numpy as np
import pandas as pd
from ipywidgets.widgets import interact, SelectMultiple

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)

sel_mul = SelectMultiple(description="Variables",options=df.columns,value=['Variable X','Variable Z'],disabled=False)
@interact(variables=sel_mul)
def plot_multiple(variables):
    df[list(variables)].plot()

Run Code Online (Sandbox Code Playgroud)

这就是结果