Показывать одно значение в диапазоне во всплывающей подсказке

#python #bokeh

#python #боке

Вопрос:

Я учусь использовать библиотеку Bokeh на Python. Что у меня есть прямо сейчас, так это:

 source = ColumnDataSource(data=dict(x=x, counts=rates))
  

Мое x значение представляет собой массив кортежей, что-то вроде этого:

 x = [('A' ,'1'), ('B', '1'), ('C', '1'), ('A', '2'), ('B', '2'), ('C', '2')]
  

Я хочу, чтобы на моем графике была всплывающая подсказка, которая будет отображать второе значение кортежа (1 или 2, в зависимости от того, что соответствует). Я создал свою всплывающую подсказку следующим образом:

 TOOLTIPS = [("Rate", "@counts"), ("Value", "@x")]
  

Первый (Rate) работает нормально и показывает значение, которое я хочу, но второй показывает оба значения (A, 1), и я хочу показать только одно из них (1). Для записи вот как я создаю фигуру:

 p = figure(x_range=FactorRange(*x), sizing_mode='stretch_both', title="Test",toolbar_location=None, tools="", tooltips=TOOLTIPS)
  

Возможно ли это?

Ответ №1:

Вы можете просто разделить x-массив на два отдельных массива, чтобы…

 x = [('A' ,'1'), ('B', '1'), ('C', '1'), ('A', '2'), ('B', '2'), ('C', '2')]
  

…становится…

 x_1 = ["A","B","C","A","B","C"]
x_2 = ["1","1","1","2","2","2"]
  

а затем передать эти массивы на компакт-диски.

Затем в вашей всплывающей подсказке вы просто ссылаетесь на x_2 подобное…

 TOOLTIPS = [("Rate", "@counts"), ("Value", "@x_2")]
  

Ответ №2:

Вы могли бы использовать обратный вызов HoverTool, подобный этому (Bokeh v1.0.4):

 from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource, FactorRange, HoverTool, CustomJS

x = [('A' , '1'), ('B', '1'), ('C', '1'), ('A', '2'), ('B', '2'), ('C', '2')]
rates = [1, 2, 3, 4, 5, 6]

source = ColumnDataSource(data = dict(x = x, counts = rates))

TOOLTIPS = [("Rate", "@counts"), ("Value", "@x")]
p = figure(x_range = FactorRange(*x), sizing_mode = 'stretch_both', title = "Test", toolbar_location = None, tools = "")
p.vbar(x = 'x', top = 'counts', width = 0.2, source = source)

code = '''  if (cb_data.index.indices.length > 0) { 
                index = cb_data.index.indices[0];
                x1 = source.data.x[index][1]
                hover.tooltips[1] = ['Value', x1]; 
            } '''
hover = HoverTool()
hover.tooltips = TOOLTIPS
hover.callback = CustomJS(args = dict(source = source, hover = hover), code = code)
p.add_tools(hover)

show(p)
  

Результат:

введите описание изображения здесь