代码之家  ›  专栏  ›  技术社区  ›  ChesuCR Ayansplatt

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

  •  1
  • ChesuCR Ayansplatt  · 技术社区  · 6 年前

    从文档中, 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]))
    

    “索引”属性已更新,但图未重新绘制。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Seb    6 年前

    这适用于customjs回调

    bt.callback = CustomJS(args={'source':source},code="""source.selected.indices = [4];source.change.emit();""")
    

    我认为python回调应该自动执行source.change.emit(),所以不确定为什么你的回调不起作用。 但是可以在js回调中显式地执行。

    我不知道为什么,但它不会触发更新选择

        2
  •  1
  •   ChesuCR Ayansplatt    6 年前

    答案更新

    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版中运行服务器时。显然不太理想,但对我有效。