HoverTool для нескольких рядов данных на участке рассеяния боке

У меня есть следующий небольшой пример script с использованием numpy и bokeh:

import numpy as np
import bokeh.plotting as bp
from bokeh.objects import HoverTool 
bp.output_file('test.html')

fig = bp.figure(tools="reset,hover")
x = np.linspace(0,2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
s1 = fig.scatter(x=x,y=y1,color='#0000ff',size=10,legend='sine')
s1.select(dict(type=HoverTool)).tooltips = {"x":"$x", "y":"$y"}
s2 = fig.scatter(x=x,y=y2,color='#ff0000',size=10,legend='cosine')
s2.select(dict(type=HoverTool)).tooltips = {"x":"$x", "y":"$y"}
bp.show()

Проблема заключается в том, что инструмент зависания работает только для кривой косинуса, но не для синуса.

Я знаю, что одним из вариантов было бы построить как серию togehter, так и изменить цвет косинусных точек данных:

import numpy as np
import bokeh.plotting as bp
from bokeh.objects import HoverTool 
bp.output_file('test.html')

fig = bp.figure(tools="reset,hover")
x = np.linspace(0,2*np.pi)

y1 = np.sin(x)
y2 = np.cos(x)

x = np.array([x,x]).flatten()
y = np.array([y1,y2]).flatten()

blue = np.array('#0000ff').flatten()
red = np.array('#ff0000').flatten()
colors = np.array([blue.repeat(len(y1)),red.repeat(len(y1))]).flatten()

s1 = fig.scatter(x=x,y=y,color=colors,size=10,legend='sine & cosine')
s1.select(dict(type=HoverTool)).tooltips = {"x":"$x", "y":"$y"}
bp.show()

Но затем я теряю запись легенды для второго цвета.

Как мне удастся навести курсор на оба набора данных и увидеть соответствующую подсказку?

Спасибо!

Max

Ответ 1

Это на самом деле ошибка, решенная в мастере. Я был исправлен в этом пиаре https://github.com/bokeh/bokeh/pull/1511

Кроме того, вам нужно будет изменить свой первый код, чтобы использовать модели вместо объектов в третьей строке, как показано ниже:

import numpy as np
import bokeh.plotting as bp
from bokeh.models import HoverTool 
bp.output_file('test.html')

fig = bp.figure(tools="reset,hover")
x = np.linspace(0,2*np.pi)
y1 = np.sin(x)
y2 = np.cos(x)
s1 = fig.scatter(x=x,y=y1,color='#0000ff',size=10,legend='sine')
s1.select(dict(type=HoverTool)).tooltips = {"x":"$x", "y":"$y"}
s2 = fig.scatter(x=x,y=y2,color='#ff0000',size=10,legend='cosine')
fig.select(dict(type=HoverTool)).tooltips = {"x":"$x", "y":"$y"}
bp.show()

Надеюсь, это поможет!

Приветствия.

Damian

ОБНОВЛЕН с комментариями ниже

Ответ 2

Если вы хотите иметь несколько инструментов наведения, вам нужно добавить несколько инструментов зависания, каждый из которых настроен для другого средства визуализации. Вы можете добавить их следующим образом:

p = figure()

r1 = p.circle([1,2,3], [4,5,6], color="blue")
p.add_tools(HoverTool(renderers=[r1], tooltips=TIPS))

r2 = p.square([4,5,6], [1,2,3], color="red")
p.add_tools(HoverTool(renderers=[r2], tooltips=TIPS))