Спасибо за понятный пример.К сожалению, я не уверен, что SelectMultiple можно использовать так, как вы собираетесь.
Обычно для интерактивного вызова вам нужна функция, которой вы передаете аргументы.Вам не нужно создавать виджет внутри тела функции, вызов interact
должен понять, какой тип входного виджета требуется из переданного параметра.
См. Здесь некоторые примеры, где вы указываете списокопций строки (https://ipywidgets.readthedocs.io/en/stable/examples/Using%20Interact.html#Widget-abbreviations)
Я сделал несколько небольших изменений в вашем коде, чтобы создать продукт взаимодействия с селектором Dropdown. Я подозреваю, что если вы хотите использовать 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

А вот версия с использованием observe
, виджет 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] if choices else df
output.clear_output(wait=True)
with output:
ax = data.plot()
plt.show()
selector.observe(multiplot, names='value')
