Изчертаване на боке: Активирайте подсказки само за някои глифове

Имам фигура с някои глифове, но искам само подсказки за показване на определени глифове. В момента има ли начин да се постигне това в Bokeh?

Като алтернатива, има ли начин да начертаете две фигури една върху друга? Изглежда, че това ще ми позволи да постигна това, което искам.


person Imaduck    schedule 03.04.2015    source източник


Отговори (4)


Благодарение на тази страница в Google Групи разбрах как може да стане това. Връзка тук

Редактиране 2015-10-20: изглежда, че връзката към групата в Google вече не работи, за съжаление. Беше съобщение от Сара Бърд @bokehplot.

Редактиране на 2017-01-18: Понастоящем това ще добави множество икони на инструменти за задържане на мишката към лентата с инструменти. Това може да причини проблеми. Вече има подаден проблем в github тук. Като алтернатива опитайте решението на @tterry в отговора по-долу.

По същество трябва да (боке версия 0.9.2):

  1. не добавяйте hover във вашите tools, когато създавате фигурата
  2. създавайте глифове поотделно
  3. добавете глифове към вашата фигура
  4. настройте инструмента за задържане на мишката за този набор от глифове
  5. добавете инструмента за насочване към вашата фигура

Пример:

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)
person WillZ    schedule 20.08.2015
comment
Имайте предвид само, че ако направите това, подсказките няма да зачитат пространството взаимно, подсказките ще се припокриват, ако се случи да задържите курсора на мишката върху два различни глифа едновременно. Има ли начин да ги накарате да уважават пространството един на друг? - person Guillochon; 26.03.2016
comment
Да, и аз забелязах това. TBH Не съм прекарал време в разглеждане на този проблем, но бих искал да чуя дали някой има решение. - person WillZ; 27.03.2016
comment
Ето връзка към проблем с git с описание как да накарате инструментите за задържане да работят само за подмножество от глифове. Включва някой на име birdsarah, така че може би това е нова връзка, която да замени тази, която ви изчезна: github.com/bokeh/bokeh/issues/2076 - person Finncent Price; 17.06.2020

Трябва да наименувате своя глиф с атрибута 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')
person Nickleman    schedule 03.05.2017
comment
Вместо изрично да създавате HoverTool, можете да добавите 'hover' към tools списък аргумент, когато създавате фигурата и след това: hover_tool = fig.select(type=HoverTool) hover_tool.names = ["ytd_ave"] - person dux2; 11.10.2018

Отговорът на Will Zhang ще работи, но в крайна сметка ще имате множество инструменти за задържане. Ако това е нежелателно, можете да добавите програми за изобразяване към съществуващ инструмент за задържане на мишката:

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's renderers.

И така, разликите тук:

  1. Можете да създадете своя глиф на високо ниво с помощта на интерфейса plotting и това пак ще работи.
  2. Не е нужно да създавате нов HoverTool (освен ако не искате различни подсказки) всеки път, просто го добавете към рендерите на съществуващия инструмент.
person tterry    schedule 01.06.2016
comment
Да, това е проблем, забелязах го едва наскоро. Вече има регистриран проблем в github за потенциално групиране на тези инструменти за задържане. github.com/bokeh/bokeh/issues/5497 - person WillZ; 19.01.2017
comment
@WillZ Мисля, че текущото внедряване е ОК, просто има проблем около случайното създаване на тон инструменти. Мога да си представя някои случаи, в които два глифа на един и същ график биха се възползвали от различни подсказки. - person tterry; 19.01.2017
comment
@tterry съгласен съм. Просто нещо за удобство - person WillZ; 20.01.2017

АКТУАЛИЗАЦИЯ от специалисти по поддръжката: задържането на курсора на мишката вече се поддържа както на линии, така и на изображения



ОСТАРЕЛИ:

Понастоящем задържането на мишката не се поддържа за глифове от типа на изображението и глифове с линии. Така че използването на един от тези глифове в комбинация с глифове, които поддържат подсказка на инструмента при задържане на мишката, може да се заобиколи.

Вижте: http://bokeh.pydata.org/en/latest/docs/user_guide/objects.html#hovertool

person dyingoptimist    schedule 06.04.2015
comment
Да, помислих си за това, но просто няма начин да го направя, освен ако не искам да запазя графика като фигура и след това да начертая върху нея, което е наистина хакерско. - person Imaduck; 06.04.2015
comment
@Imaduck Мисля, че това ще бъде страхотна функция в Bokeh. Опитвам се да направя същото, но изскачат съвети за тези глифове, които не ми трябват (но все пак искам да видя в диаграмата).. - person WillZ; 20.08.2015