Bokeh HoverTool 不适用于 multi_line
Bokeh HoverTool not working with multi_line
我正在努力解决这个问题。
Bokeh 的 multip_line 和 HoverTool 似乎不太友好。我的问题与此类似:。 (旁注:我已经尝试了那个问题的解决方案代码,但它对我不起作用,这可能不是一个好兆头。)
我在这里有我自己的可重现示例代码,从我正在处理的类似热图的情节中浓缩而来:
from bokeh.plotting import figure, output_file, show
from bokeh.models.mappers import LinearColorMapper
from bokeh.models import ColumnDataSource, ColorBar, HoverTool
output_file("heatmap.html")
p = figure(title="multi_line hover failure example")
p.add_tools(HoverTool(
show_arrow=False,
line_policy="nearest",
tooltips=[
("color", "@color"),
("name", "@name")
]))
patch_xs = [[1, 2, 2, 3], [4, 5, 6, 5], [5, 5, 8, 8]]
patch_ys = [[1, 2, 4, 1], [3, 4, 3, 2], [5, 8, 8, 5]]
patch_colors = [1, 2, 3]
patch_names = ['robert', 'quinn', 'jessy']
line_xs = [[1, 2, 2, 3], [4, 5, 6, 5], [5, 5, 8, 8]]
line_ys = [[-1, -2, -4, -1], [-3, -4, -3, -2], [-5, -8, -8, -5]]
line_colors = [-1, -2, -3]
line_names = ['karen', 'louise', 'charles']
mapper = LinearColorMapper(
palette='Turbo256',
low=min(patch_colors + line_colors),
high=max(patch_colors + line_colors),
)
# patches included to confirm that hover is working
# commenting this out does not make hover work
p.patches('xs', 'ys', line_width=1,
color={'field': 'color', 'transform': mapper},
source=ColumnDataSource(dict(
xs=patch_xs,
ys=patch_ys,
color=patch_colors,
name=patch_names
))
)
p.multi_line('xs', 'ys', line_width=8,
color={'field': 'color', 'transform': mapper},
source=ColumnDataSource(dict(
xs=line_xs,
ys=line_ys,
color=line_colors,
name=line_names
)))
p.add_layout(
ColorBar(
color_mapper=mapper,
location=(0, 0)
),
'left')
show(p)
我的代码生成了下图,其中悬停工具适用于填充的形状(如屏幕截图所示)但不适用于线条。相信我,我试过将鼠标放在所有的线条上,就像一个疯狂的阿拉丁试图哄一个精灵从它们中出来。
删除填充的形状(补丁)并不能解决问题,因此将它们留在其中以显示悬停工具应该如何工作。
有趣的是,根据文档 (https://docs.bokeh.org/en/latest/docs/reference/models/tools.html#bokeh.models.tools.HoverTool),HoverTool 不适用于补丁,但可以用于 multi_line。 (也许这与使用字形而不是图形元素有关?)
如有任何帮助,我们将不胜感激
这是一个错误。它已在 this commit 中修复并且应该在 Bokeh 2.3 中可用。
或者,您可以尝试 Bokeh 2.1 - IIRC,它在那里为我工作。
我正在努力解决这个问题。
Bokeh 的 multip_line 和 HoverTool 似乎不太友好。我的问题与此类似:
我在这里有我自己的可重现示例代码,从我正在处理的类似热图的情节中浓缩而来:
from bokeh.plotting import figure, output_file, show
from bokeh.models.mappers import LinearColorMapper
from bokeh.models import ColumnDataSource, ColorBar, HoverTool
output_file("heatmap.html")
p = figure(title="multi_line hover failure example")
p.add_tools(HoverTool(
show_arrow=False,
line_policy="nearest",
tooltips=[
("color", "@color"),
("name", "@name")
]))
patch_xs = [[1, 2, 2, 3], [4, 5, 6, 5], [5, 5, 8, 8]]
patch_ys = [[1, 2, 4, 1], [3, 4, 3, 2], [5, 8, 8, 5]]
patch_colors = [1, 2, 3]
patch_names = ['robert', 'quinn', 'jessy']
line_xs = [[1, 2, 2, 3], [4, 5, 6, 5], [5, 5, 8, 8]]
line_ys = [[-1, -2, -4, -1], [-3, -4, -3, -2], [-5, -8, -8, -5]]
line_colors = [-1, -2, -3]
line_names = ['karen', 'louise', 'charles']
mapper = LinearColorMapper(
palette='Turbo256',
low=min(patch_colors + line_colors),
high=max(patch_colors + line_colors),
)
# patches included to confirm that hover is working
# commenting this out does not make hover work
p.patches('xs', 'ys', line_width=1,
color={'field': 'color', 'transform': mapper},
source=ColumnDataSource(dict(
xs=patch_xs,
ys=patch_ys,
color=patch_colors,
name=patch_names
))
)
p.multi_line('xs', 'ys', line_width=8,
color={'field': 'color', 'transform': mapper},
source=ColumnDataSource(dict(
xs=line_xs,
ys=line_ys,
color=line_colors,
name=line_names
)))
p.add_layout(
ColorBar(
color_mapper=mapper,
location=(0, 0)
),
'left')
show(p)
我的代码生成了下图,其中悬停工具适用于填充的形状(如屏幕截图所示)但不适用于线条。相信我,我试过将鼠标放在所有的线条上,就像一个疯狂的阿拉丁试图哄一个精灵从它们中出来。
删除填充的形状(补丁)并不能解决问题,因此将它们留在其中以显示悬停工具应该如何工作。
有趣的是,根据文档 (https://docs.bokeh.org/en/latest/docs/reference/models/tools.html#bokeh.models.tools.HoverTool),HoverTool 不适用于补丁,但可以用于 multi_line。 (也许这与使用字形而不是图形元素有关?)
如有任何帮助,我们将不胜感激
这是一个错误。它已在 this commit 中修复并且应该在 Bokeh 2.3 中可用。
或者,您可以尝试 Bokeh 2.1 - IIRC,它在那里为我工作。