Bokeh Plotting: включить всплывающие подсказки только для некоторых глифов
У меня есть фигура с некоторыми глифами, но только для всплывающих подсказок нужно отображать определенные глифы. Есть ли способ сделать это в Боке?
В качестве альтернативы, есть способ построить две фигуры друг на друга? Похоже, это позволит мне выполнить то, что я хочу сделать.
Ответы
Ответ 1
Благодаря этой странице в группах Google я понял, как это можно сделать.
Ссылка здесь
Редактировать 2015-10-20: похоже, что ссылка google group больше не работает. Это было сообщение от Сары Берд @bokehplot.
Изменить 2017-01-18. В настоящее время это добавит несколько значков инструмента наведения на панель инструментов. Это может вызвать проблемы. В github . Кроме того, попробуйте @tterry решение в ответе ниже.
По существу вам необходимо (bokeh version 0.9.2):
- не добавляйте
hover
в tools
при создании фигуры
- создавать глифы индивидуально
- добавить глифы к вашей фигуре
- настроить инструмент наведения для этого набора символов
- добавьте инструмент зависания в цифру
Пример:
import bokeh.models as bkm
import bokeh.plotting as bkp
source = bkm.ColumnDataSource(data=your_frame)
p = bkp.figure(tools='add the tools you want here, but no hover!')
g1 = bkm.Cross(x='col1', y='col2')
g1_r = p.add_glyph(source_or_glyph=source, glyph=g1)
g1_hover = bkm.HoverTool(renderers=[g1_r],
tooltips=[('x', '@col1'), ('y', '@col2')])
p.add_tools(g1_hover)
# now repeat the above for the next sets of glyphs you want to add.
# for those you don't want tooltips to show when hovering over, just don't
# add hover tool for them!
Также, если вам нужно добавить легенду к каждому из глифов, которые вы добавляете, попробуйте использовать метод bokeh.plotting_helpers._update_legend()
. источник github Например:
_update_legend(plot=p, legend_name='data1', glyph_renderer=g1_r)
Ответ 2
Будет ли ответ Чжана будет работать, но вы получите множество инструментов для зависания. Если это нежелательно, вы можете добавить средства визуализации к существующему инструменту наведения:
from bokeh import plotting
from bokeh.models import HoverTool, PanTool, ResetTool, WheelZoomTool
hover_tool = HoverTool(tooltips=[('col', '@x'),('row', '@y')]) # instantiate HoverTool without its renderers
tools = [hover_tool, WheelZoomTool(), PanTool(), ResetTool()] # collect the tools in a list: you can still update hover_tool
plot = plotting.figure(tools=tools)
plot.line(x_range, y_range) # we don't want to put tooltips on the line because they can behave a little strange
scatter = plot.scatter(x_range, y_range) # we assign this renderer to a name...
hover_tool.renderers.append(scatter) # ...so we can add it to hover_tool renderers.
Итак, различия здесь:
- Вы можете создать свой глиф на высоком уровне, используя интерфейс
plotting
, и это все равно будет работать.
- Вам не нужно создавать новый HoverTool (если вы не хотите использовать разные подсказки) каждый раз, просто добавьте его в существующие средства визуализации инструментов.
Ответ 3
В настоящее время Hover не поддерживается для глифов типов и глифов линий. Таким образом, использование одного из этих глифов в сочетании с глифами, которые поддерживают подсказку для инструмента наведения, может быть проблемой.
См:
http://bokeh.pydata.org/en/latest/docs/user_guide/objects.html#hovertool
Ответ 4
Вам нужно указать свой глиф с атрибутом name=
на глифе, который вам интересен для активного инструмента зависания, а затем установить это имя в атрибуте names=
. (Обратите внимание на атрибут name=
глифа fig.line
в приведенном ниже примере.
hover = HoverTool( mode='vline', line_policy='nearest', names=['ytd_ave'],
tooltips=[
("Week Number", "@WeekNumber"),
("OH for the Week", "@OverHead{0.00}%"),
("OH Average", "@AveOverHead{0.00}%"),
("Non-Controllable Hours", "@NonControllableHours{0.0}"),
("Controllable Hours", "@ControllableHours{0.0}"),
("Total Hours", "@TotalHours{0.0}"),
]
)
fig = Figure(title='Weekly Overhead', plot_width=950, plot_height=400,
x_minor_ticks=2, tools=['pan', 'box_zoom', 'wheel_zoom', 'save',
'reset', hover])
ch = fig.vbar('WeekNumber', top='ControllableHours', name='Over Head',
color='LightCoral', source=sources, width=.5)
nch = fig.vbar('WeekNumber', bottom='ControllableHours', top='TotalOHHours',
name='Non-Controllable Over Head', color='LightGray',
source=sources, width=.5)
bh = fig.vbar('WeekNumber', bottom='TotalOHHours', top='TotalHours',
name='Project Hours', color='LightGreen', source=sources,
width=.5)
ave = fig.line('WeekNumber', 'AveOverHead', source=sources, color='red',
y_range_name='Percent_OH', name='ytd_ave')