bokeh: HoverTool () ColumnDataSource показывает ???когда используешь @ - PullRequest
0 голосов
/ 24 февраля 2019

Я хочу добавить всплывающие подсказки к ColumDataSource(), которые привязываются к ближайшей точке данных.Но при использовании @x, @y это показывает ???вместо ближайшего значения.Использование $x, $y работает нормально.

Ниже приведен пример:

from bokeh.plotting import show, figure, ColumnDataSource
from bokeh.models import HoverTool

a = [x for x in range(10)]
b = [x for x in range(10)]
c = [0.5 * x for x in range(10)]

source = ColumnDataSource(data=dict(a=a, b=b, c=c))

p = figure()
p.line(x='a', y='b', source=source)
p.line(x='a', y='c', source=source)

p.add_tools(HoverTool(
    tooltips=[
        ('index', '$index'),
        ('($x, $y)', "($x, $y)"),
        ('(@x, @y)', "(@x, @y)"),
        ('(@a, @b, @c)', "(@a, @b, @c)")],
    line_policy='nearest',
    mode='mouse'))

show(p)

РЕЗУЛЬТАТ

enter image description here

Когда я передаю списки напрямую, это работает правильно…

На рисунке с двумя графиками я хочу показать только ближайшее значение текущего отображаемого графика.Поэтому использование @b, @c не то, что я хочу.


Обновление:

На рисунке есть два графика, и я хочу только показать значение оси Y наведенного графика.

Результат, который я хочу получить:

enter image description here

Но в этом случае я передаю объекты списка напрямую:

p.line(a, b)
p.line(a, c)

p.add_tools(HoverTool(
    tooltips=[
        ('index', '$index'),
        ('(@x, @y)', "(@x, @y)")],
    line_policy='nearest',
    mode='vline'))

При использовании ColumnDataSource() я должен использовать имя переменных и не могу ссылаться на ось y, используя @y.

Поэтому я получаю следующий результат:

enter image description here

p.line(x='a', y='b', source=source)
p.line(x='a', y='c', source=source)

p.add_tools(HoverTool(
    tooltips=[
        ('index', '$index'),
        ('(@x, @y)', "(@x, @y)"),
        ('@a', '@a'),
        ('@b', '@b'),
        ('@c', '@c')],
    line_policy='nearest',
    mode='vline'))

HoverTool не показывает значение оси Y только наведенного графика.Показывает значение обоих (@b and @c).

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Я решил проблему, присвоив HoverTool() отдельному renderers.

rb = p.line(x='a', y='b', source=source)
rc = p.line(x='a', y='c', source=source)

p.add_tools(HoverTool(
    renderers=[rb],
    tooltips=[
        ('index', '$index'),
        ('(@a, @b)', "(@a, @b)")],
    line_policy='nearest',
    mode='mouse'))

p.add_tools(HoverTool(
    renderers=[rc],
    tooltips=[
        ('index', '$index'),
        ('(@a, @c)', "(@a, @c)")],
    line_policy='nearest',
    mode='mouse'))
0 голосов
/ 24 февраля 2019

Вы должны установить в ColumnDataSource свои значения для отображения.Я не совсем понимаю, что вы хотите отобразить, но я вставлю пример кода из Bokeh, который вы можете найти на странице.В основном, «x» и «y» - это переменные для построения, а следующие - переменные для отображения.

# Make the ColumnDataSource: source
source = ColumnDataSource(data={
    'x'       : data.loc[1970].fertility,
    'y'       : data.loc[1970].life,
    'country' : data.loc[1970].Country,
})

# Create the figure: p
p = figure(title='1970', x_axis_label='Fertility (children per woman)', 
y_axis_label='Life Expectancy (years)',plot_height=400, plot_width=700,
tools=[HoverTool(tooltips='@country')])

# Add a circle glyph to the figure p
p.circle(x='x', y='y', source=source)

# Output the file and show the figure
output_file('gapminder.html')
show(p) 
...