Сбор данных для вывода Bokeh HoverTool из ColumnDataSource - PullRequest
2 голосов
/ 02 мая 2019

Я немного недоволен HoverTool в Боке.У меня есть ColumnDataSource, который имеет несколько «столбцов» данных, и я использую различные столбцы для построения линий на графике.Когда я наведите курсор на одну из точек на линии, я хочу отобразить данные 'x' ('rpm' в моем CDS) и 'y' (один из других столбцов в моем CDS) для этой точки в этой строке,

Поскольку все строки используют один и тот же CDS (разные столбцы для значений 'y'), на всю жизнь я не могу понять, как различать значение 'y' для строки, находящейся наи отображать только значение 'y' для этой строки.В настоящее время я просто отображаю все значения 'y' для значения 'x', на которое наведено указание.

Я не хочу использовать параметр '$ 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)

1 Ответ

2 голосов
/ 02 мая 2019

Вы можете использовать @$name для поиска значения столбца с $name в качестве имени столбца:

hovertools= HoverTool(tooltips=[('Gear', '$name'),
                                ('data', '@$name{0.0}'),
                                ('RPM', '@rpm')],)

Но обратите внимание, чтобы это работало, значение, установленное для 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

Это дает:

enter image description here

enter image description here

Обратите внимание, что в формате «кортеж» для всплывающих подсказок первое значение метки не раскрывается, поэтому, если вы хотите, например, например, что-то вроде 4th gear: <value> для каждой строки, тогда вы захотите использовать Custom Tooltip

...