Bokeh HoverTool всплывающие подсказки для multi_line - отображение всех координат во всех точках - PullRequest
0 голосов
/ 07 мая 2018

Я изменил пример многострочного графика, представленный на официальных страницах руководства по использованию боке, чтобы добавить HoverTool со всплывающими подсказками. ( Пример руководства по использованию )

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

output_file("patch.html")

plot_data=dict(
        xs=[[1, 3, 2], [3, 4, 6, 6]],
        ys=[[2, 1, 4], [4, 7, 8, 5]],
        colors=["firebrick", "navy"],
        alphas=[0.8, 0.3])

hover=HoverTool(tooltips=[
        ('X-Coordinate','@xs'),
        ('Y-Coordinate','@ys')])

dsource = ColumnDataSource(plot_data)
p = figure(plot_width=400, plot_height=400, tools=[hover, 'wheel_zoom', ])
p.multi_line('xs', 'ys', color='colors', alpha='alphas', line_width=4, 
source=dsource)

show(p)

Я бы ожидал, что во всплывающей подсказке будут показаны координаты x и y точки, над которой (рядом с) я наведу указатель. Однако всплывающая подсказка содержит координаты x и y всех точек линии, над которыми находится указатель.

Есть ли способ / опция, спрятанная где-то (я пытался найти ее), чтобы HoverTool-tool отображал координаты одной точки?

P.S. - Я знаю, что $ x, $ y и $ sx, $ sy можно использовать для отображения координат экрана и холста x, y соответственно, но в моем случае ось x также может быть осью даты и времени, и в этом случае я бы хотел одна дата во всплывающей подсказке вместо всех дат.

enter image description hereenter image description here

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Отправка ответа с полным кодом, включая решение, предоставленное HYRY:

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

import numpy as np
import itertools
from itertools import chain

output_file("patch.html")

plot_data=dict(
        xs=[[1, 3, 2], [3, 4, 6, 6]],
        ys=[[2, 1, 4], [4, 7, 8, 5]],
        colors=["firebrick", "navy"],
        alphas=[0.8, 0.3])

hover=HoverTool()

dsource = ColumnDataSource(plot_data)
p = figure(plot_width=400, plot_height=400, tools=[hover, 'wheel_zoom', ])
p.multi_line('xs', 'ys', color='colors', alpha='alphas', line_width=4, source=dsource)


nan = itertools.repeat([np.nan])
xs, ys = (np.concatenate(list(chain(*zip(plot_data[name], nan)))) for name in ["xs", "ys"])
dsource2 = ColumnDataSource(dict(xs=xs, ys=ys))
line = p.line('xs', 'ys', source=dsource2, color='white', line_width=1, alpha=1)
hover.renderers = [line]

show(p)

Я изменил свойства «невидимой» линии, чтобы указать, как она рисуется поверх существующих линий, и, следовательно, указать координаты. Вывод теперь выглядит так: enter image description here

0 голосов
/ 08 мая 2018

Создайте невидимую линию и установите ее в hover.renderers:

import numpy as np
from itertools import chain
nan = itertools.repeat([np.nan])
xs, ys = (np.concatenate(list(chain(*zip(plot_data[name], nan)))) for name in ["xs", "ys"])
dsource2 = ColumnDataSource(dict(xs=xs, ys=ys))
line = p.line('xs', 'ys', source=dsource2, alpha=0)
hover.renderers = [line]
...