Python 在Bokeh中显示所选内容的文本批注

Python 在Bokeh中显示所选内容的文本批注,python,bokeh,Python,Bokeh,我有一个带有数据点和相关文本标签的小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

我有一个带有数据点和相关文本标签的小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)
这很接近,因为如果我在一些点周围绘制一个框,这些文本标签将显示,其余的将隐藏,但问题是它将呈现所有文本标签以开始(这不是我想要的)。初始绘图应隐藏所有标签,且仅在选择框时显示

我想我可以先用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'
尝试访问
选择符号
文本_alpha
属性时

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


我在这里做错了什么?

从版本
0.11.1
开始,默认情况下
selection\u glyph
的值为
None
。BokehJS将此解释为“不要做任何不同的事情,只需按照正常方式绘制图示符”。因此,您需要实际创建一个
选择符号
。有两种方法可以做到这一点,都在这里演示:

基本上是这样

手工 创建一个实际的
Bokeh模型,类似于:

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

使用glyph方法参数 或者,为了方便起见,
Figure.circle
接受参数,如
selection\u fill\u alpha
selection\u color
(基本上是任何行、填充或文本属性,前缀为
selection\u
):

然后将自动创建一个
圆圈
,并用于
渲染器。选择符号


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

  • 将文档更新为显式,并突出显示
    呈现程序。默认情况下,选择标志符号为
    None

  • 更改代码,以便默认情况下,
    渲染器.glyph
    选择仅是
    渲染器.glyph
    的副本(这样您的原始代码就可以工作了)

两者都是小范围的,非常适合新的贡献者。如果您有兴趣创建一个Pull请求来完成这两项任务中的任何一项,我们(和其他用户)当然会非常感谢您的贡献。在这种情况下,请首先提出一个问题


我们可以提供更多细节或回答任何问题

回答得很好,谢谢。我会尽快抽出时间,至少为这件事做点准备。
p.circle(..., selection_color="firebrick")