我在图中使用选择来驱动我的Bokeh服务器应用程序。然而,在用户选择某些内容之后,我实际上并不希望该选择对该图具有任何视觉效果。如何删除选择效果?
我可以想象有两种方法可以解决这个问题,但是无法工作:
删除回调中的选择
def cb(attr, old, new):
source.selected.indices.clear()
...
source.on_change('selected', cb)
保留所选索引,但删除它们之间的任何样式差异
我找到http://bokeh.pydata.org/en/latest/docs/user_guide/styling.html#selected-and-unselected-glyphs,但不确定如何有效地将此问题应用于我的问题。
答案 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)
我已经编写了一个GH issue来解决这个问题。我们应该有可能以编程方式更新所选样本。
如果你只想隐藏选择指数,你可以做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)]
你也可以创建一个带有颜色列的单一字形并更新源代码。它可能更有效率。
但如果我是你,我会等待修复错误。