Как настроить наведение на столбчатую диаграмму для отображения меток оси x?

#python #bokeh

#python #боке

Вопрос:

Я сгенерировал простую столбчатую диаграмму. Чтобы сделать ее более интерактивной, я добавил Hovertool в график.

 from bokeh.io import show, output_notebook
from bokeh.plotting import figure, output_file
from bokeh.models.glyphs import HBar
from bokeh.models import ColumnDataSource, Legend, HoverTool
output_notebook()

# Set x and y
functions = ['func_1', 'func_2', 'func_3']
percentage = [233.14, 312.03, 234.00]

# Set data source (color needs to be set precisely with len(category))
source = ColumnDataSource(data=dict(functions=functions, percentage=percentage))

# Set the x_range to the list of categories above
p = figure(x_range=functions, plot_height=600, plot_width=800, title="The Overall Use of my functions",
          x_axis_label='Functions', y_axis_label='Percentage')

# Categorical values can also be used as coordinates
p.vbar(x='functions', top='percentage', width=0.9, source=source)
p.add_tools(HoverTool(tooltips=[('Percentage', "@percentage")]))

show(p)
  

Хотя значение по оси y отображается правильно, я хотел бы вместо этого отобразить метку по оси x (например, Func1: 9.45). Точно так же, как на картинке, которая показана по ссылке (я пока не могу опубликовать изображение):

https://i.ibb.co/235jR39/Untitled.png

Обновление # 1 Я пытался что-то придумать, вот что у меня получилось:

 # Set Hover
percentage = list(map(lambda i: str(i), percentage))
my_hover = list(zip(functions, percentage))
p.add_tools(HoverTool(tooltips=my_hover))
  

Оказывается, он показывает каждую деталь в каждой строке, как показано ниже

https://i.ibb.co/72hmD8q/Untitled-2.png

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

1. Ваши данные для функций представляют собой список со значениями или с кортежами? (кстати: пожалуйста, всегда публикуйте минимальный, но выполнимый код) Не могли бы вы добавить небольшую (репрезентативную) часть этих данных в свой пример?

2. @Tony В принципе, это выглядело бы так функции = [‘func_1’, ‘func_2’, …..n] в процентах = [123, 342, ….. n]

Ответ №1:

Этот код работает для Bokeh версии v1.0.4.

 import math
import numpy as np
import pandas as pd
from bokeh.models import ColumnDataSource, HoverTool
from bokeh.plotting import figure, show
from bokeh.palettes import Category10

df = pd.DataFrame(data = np.random.rand(10, 1), columns = ['percentage'], index = ['Func {}'.format(nmb) for nmb in range(10)])
df['color'] = Category10[10]

source = ColumnDataSource(data = dict(functions = df.index.values, percentage = df['percentage'].values, color = df['color'].values))

p = figure(x_range = df.index.values, plot_height = 600, plot_width = 800, title = "The Overall Use of my functions",
           x_axis_label = 'functions', y_axis_label = 'percentage')

p.vbar(x = 'functions', top = 'percentage', width = 0.9, color = 'color', source = source)
p.add_tools(HoverTool(tooltips = '<font color=blue>@functions:</font><font color=red> @percentage</font>'))

p.xgrid.grid_line_color = None
p.xaxis.major_label_orientation = math.pi / 4  # Rotate axis' labels

show(p)
  

Результат:

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