【问题标题】:Python: how to make multiple selection in bokeh?Python:如何在散景中进行多项选择?
【发布时间】:2019-05-23 21:21:51
【问题描述】:

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

我有一个如下的数据框。

df = pd.DataFrame()
df['People'] = ['Eva', 'John', 'Paul','Mr a', 'Miss b', 'Mrs c' ]
df['Type']   = ['Students', 'Students', 'Students', 'Teachers', 'Teachers', 'Teachers']

假设我们有StudentTeachers

select  =  Select(title="People",  options=['Student', 'Teachers' ])

那么我们有三个学生:EvaJohnPaul 和三个老师Mr aMiss bMrs c

我们如何创建第二个选择select2,如果我们选择教师,则选择EvaJohnPaul,如果我们选择Teachers,则选择Mr aMiss bMrs c

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)

【问题讨论】:

    标签: python bokeh


    【解决方案1】:

    使用此代码,您可以动态添加/删除第二个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)
    

    【讨论】:

    • 感谢您的回答。我为此添加了几个 cmets。因为在我的真实案例中,我有一个包含多个案例的数据框。我刚刚写了那个简单的例子。我用数据框修改了这个问题。我想知道在这种情况下我该怎么做。
    • 是否可以做一个类似的菜单而不使小部件出现和消失?
    • 您的意思是每次在第一个选择时都永久添加一个新小部件吗?然后只需删除包含layout.children.remove 的行和进行中的if 语句。
    • 我想要一个只更改选项的固定小部件。
    • 然后你只需将一个新列表分配给Select widget 的options 属性:select.options = ['cats','dogs']
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2021-05-28
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多