请问,如何使用用户“选择”小部件更新滑块的最小值和最大值(index_min和index_max)?例如,被选择时U1,滑块的最小值和最大值应为2586和2836
if
答案 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))