散景-如何使用“选择”小部件更新滑块的最小值和最大值?

时间:2020-06-07 15:53:56

标签: python select widget slider bokeh

请问,如何使用用户“选择”小部件更新滑块的最小值和最大值(index_min和index_max)?例如,被选择时U1,滑块的最小值和最大值应为2586和2836

if

1 个答案:

答案 0 :(得分:1)

这就是我要怎么做。

import pandas as pd

from bokeh.io import curdoc
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Select, Slider

df = pd.DataFrame({'Time': [2586, 2836, 2986, 3269, 3702, 1, 2],
                   'X': [120, 210, 80, 98, 40, 0, 1],
                   'Y': [230, 40, 33, 122, 10, 1, 2],
                   'User': ['u1', 'u1', 'u2', 'u2', 'u2', 'u3', 'u4'],
                   'img': ['tree1.png', 'tree2.jpg', 'tree3.jpg', 'tree4.jpg', 'tree5.jpg', 'x', 'x']})

source = ColumnDataSource(data=dict(time=[], x=[], y=[], user=[], img=[]))

user_options = [('', 'Please select ...')] + [(o, o) for o in sorted(set(df['User']))]
users = Select(title="User:", value=user_options[0][0], options=user_options)

index = Slider(start=0, end=1, value=0, step=1, title="Time Index")


def filter_by_user(user):
    if user:
        return df[df['User'] == user]
    return df


def on_user_change(attr, old, new):
    selected = filter_by_user(new)
    start = selected['Time'].min()
    end = selected['Time'].max()
    index.update(start=start,
                 end=end + 1 if start == end else end,
                 value=start,
                 disabled=start == end)


users.on_change('value', on_user_change)


def on_index_change(attr, old, new):
    selected = filter_by_user(users.value)
    dfnew = selected[selected['Time'] <= new]
    # Note: if you rename your df columns to all lower-case, then you can just use `ColumnDataSource.from_df()`.
    source.data = dict(time=dfnew['Time'], x=dfnew['X'], y=dfnew['Y'], user=dfnew['User'], img=dfnew['img'])


index.on_change('value', on_index_change)

# Just to populate the initial data.
on_user_change(None, None, '')

curdoc().add_root(column(users, index))