用于multi_line的Bokeh HoverTool工具提示 - 显示所有点的所有坐标

时间:2018-05-07 17:10:55

标签: python-3.x hover tooltip bokeh multiline

我修改了官方散景使用指南页面上提供的multi_line绘图示例,以添加带有工具提示的HoverTool。 (Usage guide example

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)附近的x和y坐标。但是,工具提示包含指针悬停的所有线点的x和y坐标。

是否有某种方式/选项埋藏在某处(我试图很难找到它)使HoverTool工具显示单点的坐标?

P.S。 - 我知道$ x,$ y和$ sx,$ sy可以分别用于显示屏幕和画布x,y坐标,但在我的情况下,x轴也可以是日期时间轴,在这种情况下我想要工具提示中的一个日期而不是所有日期。

enter image description here enter image description here

2 个答案:

答案 0 :(得分:1)

制作一条不可见的行,并将其设置为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]

答案 1 :(得分:0)

使用完整代码发布答案,包括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