如何从散景图中清除选择?

时间:2018-06-12 14:13:37

标签: python python-3.x plot bokeh

我在图中使用选择来驱动我的Bokeh服务器应用程序。然而,在用户选择某些内容之后,我实际上并不希望该选择对该图具有任何视觉效果。如何删除选择效果?

我可以想象有两种方法可以解决这个问题,但是无法工作:

  1. 删除回调中的选择

    def cb(attr, old, new):
        source.selected.indices.clear()
        ...
    
    source.on_change('selected', cb)
    
  2. 保留所选索引,但删除它们之间的任何样式差异

    我找到http://bokeh.pydata.org/en/latest/docs/user_guide/styling.html#selected-and-unselected-glyphs,但不确定如何有效地将此问题应用于我的问题。

2 个答案:

答案 0 :(得分:2)

可以禁用选择/非选择字形或使用主字形,例如:

r = plot.scatter(...)
r.selection_glyph = None
r.nonselection_glyph = None

r = plot.scatter(...)
r.selection_glyph = r.glyph
r.nonselection_glyph = r.glyph

答案 1 :(得分:1)

选项1

我已经编写了一个GH issue来解决这个问题。我们应该有可能以编程方式更新所选样本。

选项2

如果你只想隐藏选择指数,你可以做Mateusz所说的。

通常你只有一个包含选定元素和非选定元素的字形,如下所示:

c = self.plot.scatter(
    x='x',
    y='x',
    size=4,
    line_color=None,
    fill_color='blue',
    source=source,
    view=view,

    nonselection_line_color=None,
    nonselection_fill_color='blue',
    nonselection_fill_alpha=1.0,
)
c.selection_glyph = Circle(
    line_color=None,
    line_alpha=1.0,
    fill_color='red',
)

但是,如果您想更改选择,并在自定义选择上保留选择颜色,则可以使用实际选择的样本管理另一个列表custom_selection。因此,您需要创建两个字形,一个用于选定的字形,另一个用于未选择的样本。像这样:

c = self.plot.scatter(
    x='x',
    y='x',
    size=4,
    line_color=None,
    fill_color='blue',
    source=source,
    view=view_non_selected,          # here the view should have the non-selected samples

    nonselection_line_color=None,
    nonselection_fill_color='blue',
    nonselection_fill_alpha=1.0,
)
c.selection_glyph = Circle(
    line_color=None,
    line_alpha=1.0,
    fill_color='blue',  # I plot the selected point with blue color here as well
)

c_sel = self.plot.scatter(
    x='x',
    y='x',
    size=4,
    line_color=None,
    fill_color='red',
    source=source,
    view=view_selected,          # here the view should have the selected samples

    nonselection_line_color=None,
    nonselection_fill_color='red',
    nonselection_fill_alpha=1.0,
)
c_sel.selection_glyph = Circle(
    line_color=None,
    line_alpha=1.0,
    fill_color='red',  # I plot the selected point with blue color here as well
)

每次要更新选择时,都必须更新视图索引列表:

view_non_selected.filters = [IndexFilter(non_selected_indices_list)]
view_selected.filters = [IndexFilter(custom_selection)]

你也可以创建一个带有颜色列的单一字形并更新源代码。它可能更有效率。

但如果我是你,我会等待修复错误。