在Bokeh中显示选择的文本注释

时间:2016-05-09 14:50:16

标签: python bokeh

我有一个带有数据点和相关文本标签的小散景图。我想要的是文本标签仅在用户使用框选择工具选择点时出现。这让我很接近:

from bokeh.plotting import ColumnDataSource,figure,show

source = ColumnDataSource(
    data=dict(
        x=test[:,0],
        y=test[:,1],
        label=[unquote_plus(vocab_idx[i]) for i in range(len(test))]))

TOOLS="box_zoom,pan,reset,box_select"
p = figure(plot_width=400, plot_height=400,tools=TOOLS)
p.circle(x='x',y='y', size=10, color="red", alpha=0.25,source=source)

renderer = p.text(x='x',y='y',text='label',source=source)

renderer.nonselection_glyph.text_alpha=0.

show(p)

这很接近,因为如果我在某些点周围画一个框,那些文本标签会被显示而其余部分被隐藏,但问题是它会渲染所有文本标签(这不是我想要的) 。初始绘图应隐藏所有标签,并且它们应仅出现在box_select上。

我想我可以先用alpha = 0.0渲染一切,然后设置一个selection_glyph参数,如下所示:

...
renderer = p.text(x='x',y='y',text='label',source=source,alpha=0.)
renderer.nonselection_glyph.text_alpha=0.
renderer.selection_glyph.text_alpha=1.
...

但这会引发错误:

AttributeError: 'NoneType' object has no attribute 'text_alpha'

尝试访问text_alpha时的selection_glyph属性。

我知道我可以在这里或类似地使用悬停效果,但需要标签默认为不可见。另一种但不理想的解决方案是使用切换按钮来打开和关闭标签,但我也不确定如何做到这一点。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

自版本0.11.1起,selection_glyph的值默认为None。 BokehJS将其解释为“不要做任何不同的事情,只需将字形绘制为正常”。所以你需要实际创建一个selection_glyph。有两种方法可以做到这一点,这两种方法都在这里展示:

http://bokeh.pydata.org/en/latest/docs/user_guide/styling.html#selected-and-unselected-glyphs

基本上,他们是

手动

创建一个实际的Circle Bokeh模型,例如:

selected_circle = Circle(fill_alpha=1, fill_color="firebrick", line_color=None)
renderer.selection_glyph = selected_circle

OR

使用字形方法参数

或者,方便Figure.circle接受selection_fill_alphaselection_color等参数(基本上是任何行或填充或文字属性,前缀为selection_):

p.circle(..., selection_color="firebrick")

然后会自动创建Circle并用于renderer.selection_glyph

我希望这是有用的信息。如果是这样,它强调可以通过两种方式改进项目:

  • 将文档更新为明确的,并突出显示renderer.selection_glyph默认为None

  • 更改代码,以便renderer.selection_glyph默认只是renderer.glyph的副本(然后您的原始代码才有效)

要么范围很小,也不适合新的贡献者。如果您有兴趣处理Pull Request以执行这些任务中的任何一项,我们(和其他用户)肯定会感谢您的贡献。在这种情况下,请先在

处提出问题

https://github.com/bokeh/bokeh/issues

参考此讨论,我们可以提供更多详细信息或回答任何问题。