Хотите отобразить данные всплывающей подсказки HoverTool с помощью инструмента TapTool в боке

#javascript #python #plot #bokeh #interactive

Вопрос:

Я новичок в python и хочу создать интерактивную диаграмму с набором данных, заданным в классе. Я хочу иметь возможность просто отображать данные, связанные с выбранной точкой, с помощью инструмента TapTool в Боке. Однако данные слишком плотные, чтобы просто использовать hovertool. Похоже, что для hovertool не требовался javascript, но, по-видимому, для получения инструмента tap требуется знание совершенно другого языка программирования. Я не знаком с python как таковым, поэтому добавление обратного вызова javascript немного усложняет ситуацию.

Прямо сейчас у меня есть эта цифра, построенная с помощью моего фрейма данных, используя данные из набора данных о жилье в Калифорнии от sci-kit. У меня также есть данные выборки US_states из боке для построения графика.

 from bokeh.layouts import layout
from bokeh.plotting import figure, show, output_file
from bokeh.models import Circle, Div, ColumnDataSource, CustomJS, MultiChoice, HoverTool, LinearColorMapper, ColorBar
from bokeh.io import output_notebook
from bokeh.sampledata import us_states
from bokeh.transform import transform
from bokeh.models.tools import *

#US state sample data
us_states = us_states.data.copy()
us_states = us_states["CA"]



#Creating figure and adding california basemap
color = LinearColorMapper(palette = 'Viridis256',
                      low = df.MedInc.min(),
                      high = df.MedInc.max())
color2 = LinearColorMapper(palette = 'Inferno256',
                      low = df.price.min(),
                      high = df.price.max())

cal = figure(title = "California Housing Data Geographic Distribution",
         plot_width = 1000)

cal.circle('Longitude','Latitude',source = geo_source, 
       color= transform('MedInc', color),size =2,
       alpha = 0.2,legend_label = "Median Income")

cal.circle('Longitude','Latitude',source = geo_source, 
       color= transform('price', color2),size =1,
       alpha = 0.2,legend_label = "House Price")



 color_bar = ColorBar(color_mapper = color,
                 label_standoff = 14,
                 location = (0,0),
                 title = 'Median Income')

 color_bar2 = ColorBar(color_mapper = color2,
                 label_standoff = 14,
                 location = (0,0),
                 title = 'House Price')

 cal.add_layout(color_bar,'right')
 cal.add_layout(color_bar2,'right')

 cal.legend.location = "top_right"
 cal.legend.click_policy="hide"
                      
 

Я понятия не имею, что писать для обратного вызова JS для TapTool, хотя, поскольку я не совсем уверен, как это работает, как передаются переменные и т. Д.

 callback = CustomJS(args=dict(source=geo_source), code="""
//Insert JS code here
""")

taptool = TapTool(callback=callback)
geo_source.selected.js_on_change('indices', callback)
cal.add_tools(taptool)
 

Ответ №1:

вы должны добавить фигуру в событие касания

 plot.on_event(Tap, function)
 

и в функции вы можете использовать индексы для обновления ваших данных/графика

 def function():
    print(source.selected.indices)