Python 从ColumnDataSource为Bokeh HoverTool输出拾取数据

Python 从ColumnDataSource为Bokeh HoverTool输出拾取数据,python,python-3.x,bokeh,Python,Python 3.x,Bokeh,我对Bokeh的气垫工具有点恼火。我有一个ColumnDataSource,它有多个数据“列”,我使用不同的列在图形上绘制线条。当我将鼠标悬停在一条线上的一个点上时,我想显示该线上该点的“x”(CD中的“rpm”数据)和“y”(CD中的其他列之一)数据 由于所有行都使用相同的CD(“y”值的不同列),就我的一生而言,我不知道如何区分悬停行的“y”值,而只显示该行的“y”值。目前,我只是显示悬停在“x”上的所有“y”值 我不想使用“$y”参数,因为这只是光标在图形上的位置,而不是悬停点的数据 我很

我对Bokeh的气垫工具有点恼火。我有一个ColumnDataSource,它有多个数据“列”,我使用不同的列在图形上绘制线条。当我将鼠标悬停在一条线上的一个点上时,我想显示该线上该点的“x”(CD中的“rpm”数据)和“y”(CD中的其他列之一)数据

由于所有行都使用相同的CD(“y”值的不同列),就我的一生而言,我不知道如何区分悬停行的“y”值,而只显示该行的“y”值。目前,我只是显示悬停在“x”上的所有“y”值

我不想使用“$y”参数,因为这只是光标在图形上的位置,而不是悬停点的数据

我很感激你的想法。谢谢

注意,该程序绘制给定发动机转速下的车辆速度,每个系列由变速器档位决定

import itertools
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.palettes import Category20_20 as palette

data={'rpm': range(2000, 4000, 500),
     '1st': [15.00040961597459,
             18.750512019968237,
             22.50061442396188,
             26.25071682795553],
     '2nd': [28.241511931310182,
             35.301889914137725,
             42.36226789696527,
             49.422645879792825],
     '3rd': [45.751249328722494,
             57.18906166090312,
             68.62687399308373,
             80.06468632526436],
     '4th': [66.30615844742391,
             82.8826980592799,
             99.45923767113587,
             116.03577728299183]}

cds = ColumnDataSource(data=data)

fig = figure(width=800, height= 600, title='Speed', x_axis_label='RPM', y_axis_label='Speed(mph)')
hovertools= HoverTool(tooltips=[('Gear', '$name'),
                                ('4th', '@4th{0.0}'),
                                ('3rd', '@3rd{0.0}'),
                                ('2nd', '@2nd{0.0}'),
                                ('1st', '@1st{0.0}'),
                                ('RPM', '@rpm')],)

colors = itertools.cycle(palette)
fig.add_tools(hovertools)
for gear in ('1st', '2nd', '3rd', '4th'):
    color = colors.__next__()
    fig.line(x='rpm',
             y=gear,
             source=cds,
             color=color,
             legend=gear + ' gear',
             muted_color=color,
             muted_alpha=0.2,
             line_width=1,
             name=gear + ' gear')
    fig.circle(x='rpm',
               y=gear,
               source=cds,
               color=color,
               legend=gear + ' gear',
               muted_color=color,
               muted_alpha=0.2,
               line_width=1,
               name=gear + ' gear')

fig.legend.click_policy = "mute"
fig.legend.background_fill_alpha = 0.5

show(fig)

您可以使用
@$name
查找将
$name
作为列名的列的值:

hovertools= HoverTool(tooltips=[('Gear', '$name'),
                                ('data', '@$name{0.0}'),
                                ('RPM', '@rpm')],)
但请注意,要使其工作,您在glyph方法中为
name
设置的值必须与列名匹配。例如,我必须改变:

for gear in ('1st', '2nd', '3rd', '4th'):
    color = colors.__next__()
    fig.line(x='rpm',
             y=gear,
             ...
             name=gear)   # CHANGED to match column name
    fig.circle(x='rpm',
               y=gear,
               ...
               name=gear) # CHANGED to match column name
这将产生:


请注意,在工具提示的“元组”格式中,第一个标签值不会被导出,因此,如果您希望在每行基础上使用例如
4th gear:
之类的内容,那么您需要使用一个谢谢!!!这正是我所需要的。这是我第二次遇到这个问题。我希望有一个更直观、更干净的方法来做这件事,但它完成了任务。我一直在浏览文档,不知道如何完成它。我尝试了一些非常接近的方法,但没有成功。这些文档对于基本示例之外的内容有点缺乏细节。特别是在格式化方面。再次感谢!从技术上讲,这是第一节,但可能很容易错过。如果您熟悉Sphinx/ReST,请随时帮助改进文档。谢谢,我已经读了好几遍了。主要是缺乏对变量扩展(特别是嵌套扩展,例如@$name{0.0})和格式的理解,这给我带来了麻烦。对,这有点模糊,主要是历史的结果。一般来说,
@foo
@{foo}
始终表示引用名为“foo”的列。然后添加了“特殊”变量
$name
,该变量报告渲染器的名称。最后,人们希望使用该名称作为列名,因此我们决定使用
@$name
,或“使用$name的值作为列名”,作为在现有约定内提供该功能的路径。但是是的,这不是最明显的事情,可以更好地记录/解释。