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

У меня есть диаграмма рассеяния, которую я создал в Bokeh, и я очень хотел бы иметь возможность изменять подсказки, отображаемые на Hovertool, в зависимости от вашего выбора в раскрывающемся меню.Если выбран «Stat Set 1», я хочу показать статистику 1 и 2.Если выбран «Stat Set 2», я хочу показать статистику 3,4,5.

Я бы хотел, чтобы конечный результат был html-файлом, поэтому использование CustomJS для обратного вызова, вероятно, является обязательным.,Вот где мне удалось получить с кодом.Проблема, скорее всего, связана с обратным вызовом, так как я совсем не уверен, как связываться со всплывающими подсказками с помощью обратного вызова.

import pandas as pd
from bokeh.plotting import figure, show
from bokeh.models import CustomJS, ColumnDataSource, HoverTool, ColumnDataSource, Select
from bokeh.layouts import row

#Create a dataframe with x and y coordinates and 4 different statistics
df = pd.DataFrame({
            'x':[1,2,3],
            'y':[1,2,3],
            'stat1':[1,2,3],
            'stat2':[4,5,6],
            'stat3':[7,8,9],
            'stat4':[10,11,12],
            'stat5':[13,14,15]
})

#Create Bokeh's ColumnDataSource
source=ColumnDataSource(data=df)

#Create the different options for the Hovertool tooltips
option1=[('Stat1','@stat1'),
         ('Stat2','@stat2')]

option2=[('Stat3','@stat3'),
         ('Stat4','@stat4'),
         ('Stat5','@stat5')]

#Set the default option for the Hovertool tooltips
hover=HoverTool(tooltips=option1)

#Create the figure
plot = figure(tools=[hover])
plot.circle('x', 'y', source=source)

#Create the callback that will update the tooltips
callback = CustomJS (args=dict(tt=plot.hover), code="""
    if (cb_obj.value='Stat Set 1') {
        tt.tooltips=option1
    } else {
        tt.tooltips=option2
    }
    """)

#Create a dropdown menu that allows you to change which set of stats will populate the tooltips
stat_select=Select(options=['Stat Set 1', 'Stat Set 2'],
                        value='Stat Set 1',
                         title='What stats set do you want to see when you hover?', callback=callback)

show(row(stat_select,plot))

1 Ответ

0 голосов
/ 27 ноября 2018

Я нашел кого-то с ответом в дискурсе Боке .

plot.hover возвращает список, так как график может иметь несколько всплывающих подсказок.Таким образом, вместо использования tt.tooltips = option1 необходимо подписать tt, чтобы использовать первую запись в списке, т.е. tt[0].tooltips = option1.

options = [option1, option2]

#Create the callback that will update the tooltips

callback = CustomJS (args=dict(tt=plot.hover, opts=options), code="""

if (cb_obj.value=='Stat Set 1') {

    tt[0].tooltips=opts[0]

} else {

    tt[0].tooltips=opts[1]

}

""")
...