Как выделить линию из другой фигуры в Боке?

#python #bokeh

Вопрос:

В приведенном ниже примере (Боке 2.3.3), когда я навожу курсор над одной строкой (продажи Алисы), ширина строки увеличивается. Как я могу одновременно расширить другую строку (рейтинги Алисы)?

 import random

import bokeh.io
import bokeh.palettes
import bokeh.layouts
import bokeh.plotting

months = list(range(12))
quarters = list(range(4))

sales = {
    'alice': [random.randint(0,100) for _ in months],
    'bob': [random.randint(0,100) for _ in months],
}
ratings = {
    'alice': [random.randint(0,5) for _ in quarters],
    'bob': [random.randint(0,5) for _ in quarters],
}

TOOLS = 'hover'

f1 = bokeh.plotting.figure(title='sales', plot_height=200, tools=TOOLS)
f1.line(months, sales['alice'], name='alice', hover_line_width=3)
f1.line(months, sales['bob'], name='bob', hover_line_width=3)

f2 = bokeh.plotting.figure(title='ratings', plot_height=200,tools=TOOLS)
f2.line(quarters, ratings['alice'], name='alice', hover_line_width=3)
f2.line(quarters, ratings['bob'], name='bob', hover_line_width=3)

# hover callback (?)

bokeh.io.show(bokeh.layouts.gridplot([[f1],[f2]]))
 

Ответ №1:

Есть два способа сделать это. Во-первых, вы должны использовать один и тот же источник, и они автоматически связаны. Во-вторых, вы можете использовать инструмент tap с индексами для ссылки на другой график. Вы можете использовать on_event или js_on_event для TapTool

Наконец, почему вы используете полные функции, такие как «bokeh.io.show»? вы могли бы импортировать. Кроме того, для второго варианта вы должны использовать ColumnDataSource

Комментарии:

1. Я попытался использовать инструмент tap вместо наведения курсора, но не смог написать пользовательский обратный вызов js, чтобы выбрать другой, отображаемый по имени. Как я могу этого достичь? Для импорта я делаю это таким образом, потому что у меня есть и боке, и matplotlib в одном блокноте.