Python:如何在bokeh中进行多重选择?

Python:如何在bokeh中进行多重选择?,python,bokeh,Python,Bokeh,我想从选择中选择一个小节 我有一个如下所示的数据帧 df = pd.DataFrame() df['People'] = ['Eva', 'John', 'Paul','Mr a', 'Miss b', 'Mrs c' ] df['Type'] = ['Students', 'Students', 'Students', 'Teachers', 'Teachers', 'Teachers'] 假设我们有学生和教师 select = Select(title="People", opt

我想从选择中选择一个小节

我有一个如下所示的数据帧

df = pd.DataFrame()
df['People'] = ['Eva', 'John', 'Paul','Mr a', 'Miss b', 'Mrs c' ]
df['Type']   = ['Students', 'Students', 'Students', 'Teachers', 'Teachers', 'Teachers']
假设我们有
学生
教师

select  =  Select(title="People",  options=['Student', 'Teachers' ])
select2  =  Select(title="Selected",  options=[ (`Eva`, `John`, `Paul`), (Mr a`, `Miss b`, `Mrs c`)] ])
然后我们有三名学生:
Eva
John
Paul
和三名教师
a先生
b小姐
c夫人

如果我们选择教师和
先生a
小姐b
夫人c
如果我们选择
教师
,我们如何创建第二个选择
select2
,选择
Eva
John
Paul

select  =  Select(title="People",  options=['Student', 'Teachers' ])
select2  =  Select(title="Selected",  options=[ (`Eva`, `John`, `Paul`), (Mr a`, `Miss b`, `Mrs c`)] ])
这就是我的想法

select_data = Select(title="Type",  options=['None', 'Students', 'Teachers' ], value = '')
dynamic_select = Select(title = 'People', value = ''  , 
                        options = ['None','Eva', 'John', 'Paul','Mr a', 'Miss b', 'Mrs c' ] )
controls = widgetbox(select_data, dynamic_select)
layout = column(row(controls))

def update_layout(attr, old, new):
        if select_data.value == 'Students':
            dynamic_select = Select(title = 'People', value = '', options = ['Eva', 'John', 'Paul'])
        if select_data.value == 'Teachers':
            dynamic_select = Select(title = 'People', value = '', options = ['Mr a', 'Miss b', 'Mrs c'])
        if select_data.value == 'None':
            dynamic_select = Select(title = 'People', value = '', options = ['None'])     


select_data.on_change('value', update_layout)
dynamic_select.on_change('value', update_layout)
curdoc().add_root(layout)

使用此代码,您可以动态添加/删除第二个
Select
小部件。这是你想要的吗

from bokeh.plotting import curdoc, show
from bokeh.models import Select, Column, Div
from datetime import datetime, timedelta
import numpy as np

students = ['Eva', 'John', 'Paul']
teachers = ['Mr a', 'Miss b', 'Mrs c']
select_data = Select(title="People",  options=['', 'Students', 'Teachers' ], value = '')
layout = Column(select_data)

def update_layout(attr, old, new):
    if new:
        if len(layout.children) > 1 and layout.children[len(layout.children) - 1].title != new:
            layout.children.remove(layout.children[len(layout.children) - 1])

        options = students if new == 'Students' else teachers
        dynamic_select = Select(title = '{}'.format(new), value = '', options = options)
        layout.children.append(dynamic_select)

select_data.on_change('value', update_layout)
curdoc().add_root(layout)

使用此代码,您可以动态添加/删除第二个
选择
小部件。这是你想要的吗

from bokeh.plotting import curdoc, show
from bokeh.models import Select, Column, Div
from datetime import datetime, timedelta
import numpy as np

students = ['Eva', 'John', 'Paul']
teachers = ['Mr a', 'Miss b', 'Mrs c']
select_data = Select(title="People",  options=['', 'Students', 'Teachers' ], value = '')
layout = Column(select_data)

def update_layout(attr, old, new):
    if new:
        if len(layout.children) > 1 and layout.children[len(layout.children) - 1].title != new:
            layout.children.remove(layout.children[len(layout.children) - 1])

        options = students if new == 'Students' else teachers
        dynamic_select = Select(title = '{}'.format(new), value = '', options = options)
        layout.children.append(dynamic_select)

select_data.on_change('value', update_layout)
curdoc().add_root(layout)

谢谢你的回答。我补充了几点意见。因为在我的真实案例中,我有一个包含多个案例的数据框架。我只是写了一个简单的例子。我用数据框修改了这个问题。我想知道在这种情况下我该怎么做。是否可以在不使小部件出现和消失的情况下执行类似的菜单?您的意思是每次在第一个小部件中进行选择时永久添加一个新的小部件?然后只需删除包含
layout.children.remove
和继续执行的
if
语句的行。我希望有一个只更改选项的固定小部件。然后您只需为
Select
小部件的
options
属性分配一个新列表:
Select.options=['cats','dogs']
谢谢你的回答。我补充了几点意见。因为在我的真实案例中,我有一个包含多个案例的数据框架。我只是写了一个简单的例子。我用数据框修改了这个问题。我想知道在这种情况下我该怎么做。是否可以在不使小部件出现和消失的情况下执行类似的菜单?您的意思是每次在第一个小部件中进行选择时永久添加一个新的小部件?然后只需删除包含
layout.children的行。删除
和继续执行的
if
语句。我希望有一个只更改选项的固定小部件。然后您只需为
Select
小部件的
options
属性分配一个新列表:
Select.options=['cats','dogs']