如何以编程方式更新选定的源索引?

时间:2018-05-30 12:03:15

标签: python python-3.x plot selection bokeh

从文档中,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属性已更新,但图形未重新绘制。

2 个答案:

答案 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版的服务器时。显然不理想,但对我有用。