从文档中,Selection
对象说:
通常通过使用SelectTool选择绘图中的点来创建选择,但也可以通过编程方式指定。
但我不知道如何以编程方式设置一些选定点。例如,如果我想通过单击某个按钮来更新选择。我可以更新元素source.selected.indices
,但不会触发事件,并且这些点未标记为已选中
from bokeh.io import curdoc
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.layouts import column
from bokeh.models.tools import LassoSelectTool, TapTool
from bokeh.models.widgets.buttons import Button
source = ColumnDataSource(dict(
x=[1, 2, 3, 4, 5, 6],
y=[1, 2, 3, 4, 5, 6],
))
p = figure(
plot_height=300,
tools='',
)
p.circle( x='x', y='y', size=20, source=source)
lasso_select = LassoSelectTool(
select_every_mousemove=False,
)
tap = TapTool()
tools = (lasso_select, tap)
p.add_tools(*tools)
def update_selection_programmatically():
source.selected.update(indices=[4]) # the indices attribute is updated but the figure is not repainted, some event is not triggered.
# So the points are not marked as selected
bt = Button(
label="Update Selection",
button_type="success",
width=50
)
bt.on_click(update_selection_programmatically)
def update_selection(attr, old, new):
print('>> NEW SELECTION: {}'.format(new.indices))
# new.indices = [0] # this works fine here
source.on_change('selected', update_selection)
curdoc().add_root(column([p, bt]))
indices属性已更新,但图形未重新绘制。
答案 0 :(得分:1)
这适用于CustomJS回调
bt.callback = CustomJS(args={'source':source},code="""source.selected.indices = [4];source.change.emit();""")
我认为Python回调应该自动执行source.change.emit(),所以不确定为什么你的回调不起作用。 但是你可以在JS回调中明确地做到这一点。
我不知道为什么,但它没有触发update_selection
答案 1 :(得分:1)
最终bokeh开发人员解决了该问题。现在可以使用
更新索引source.selected.update(indices=[4])
# or equivalently
source.selected.indices = [4]
johncthomas wrote a comment in the GitHub issue。有一种解决方法:
我想出了解决办法
# When this does not update the visible selections source.selected.indices = new_indicies # This causes the selections to be visible source.data = source.data
特别是在运行13.0版的服务器时。显然不理想,但对我有用。