散景绘图:仅对某些字形启用工具提示
Bokeh Plotting: Enable tooltips for only some glyphs
我有一个带有一些字形的图形,但只希望工具提示显示某些字形。目前有没有办法在 Bokeh 中完成此操作?
或者,有没有办法将两个图形叠加在一起?看来这样就可以完成我想做的事情了。
来自维护者的更新:悬停现在支持行和图像
已过时:
图像类型字形和线条字形目前不支持悬停。因此,将这些字形之一与支持悬停工具提示的字形结合使用可能是一种变通方法。
参见:
http://docs.bokeh.org/en/latest/docs/user_guide/objects.html#hovertool
感谢 Google 组中的这个页面,我弄清楚了如何做到这一点。
Link here
编辑 2015-10-20:不幸的是,看起来 google 组 link 不再工作了。这是来自 Sarah Bird @bokehplot 的消息。
编辑 2017-01-18:目前这会向工具栏添加多个悬停工具图标。这可能会导致问题。在 github here 已经有一个问题被提交。或者,在下面的答案中尝试@tterry 的解决方案。
基本上你需要(散景版本 0.9.2):
- 创建图形时不在
tools
中添加 hover
- 单独创建字形
- 为您的图形添加字形
- 为这组字形设置悬停工具
- 将悬停工具添加到您的图形
示例:
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 source 例如:
_update_legend(plot=p, legend_name='data1', glyph_renderer=g1_r)
会起作用,但您最终会得到多个悬停工具。如果这是不可取的,您可以将渲染器添加到现有的悬停工具:
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.
这里的区别是:
- 您可以使用
plotting
界面以高级方式创建字形,这仍然有效。
- 您不必每次都创建新的 HoverTool(除非您想要不同的工具提示),只需将其添加到现有工具的渲染器即可。
您需要使用您有兴趣激活悬停工具的字形上的 name=
属性来命名您的字形,然后在悬停工具的 names=
属性中设置该名称。 (请注意下面示例中 fig.line
字形的 name=
属性。
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')
我有一个带有一些字形的图形,但只希望工具提示显示某些字形。目前有没有办法在 Bokeh 中完成此操作?
或者,有没有办法将两个图形叠加在一起?看来这样就可以完成我想做的事情了。
来自维护者的更新:悬停现在支持行和图像
已过时:
图像类型字形和线条字形目前不支持悬停。因此,将这些字形之一与支持悬停工具提示的字形结合使用可能是一种变通方法。
参见: http://docs.bokeh.org/en/latest/docs/user_guide/objects.html#hovertool
感谢 Google 组中的这个页面,我弄清楚了如何做到这一点。 Link here
编辑 2015-10-20:不幸的是,看起来 google 组 link 不再工作了。这是来自 Sarah Bird @bokehplot 的消息。
编辑 2017-01-18:目前这会向工具栏添加多个悬停工具图标。这可能会导致问题。在 github here 已经有一个问题被提交。或者,在下面的答案中尝试@tterry 的解决方案。
基本上你需要(散景版本 0.9.2):
- 创建图形时不在
tools
中添加hover
- 单独创建字形
- 为您的图形添加字形
- 为这组字形设置悬停工具
- 将悬停工具添加到您的图形
示例:
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 source 例如:
_update_legend(plot=p, legend_name='data1', glyph_renderer=g1_r)
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.
这里的区别是:
- 您可以使用
plotting
界面以高级方式创建字形,这仍然有效。 - 您不必每次都创建新的 HoverTool(除非您想要不同的工具提示),只需将其添加到现有工具的渲染器即可。
您需要使用您有兴趣激活悬停工具的字形上的 name=
属性来命名您的字形,然后在悬停工具的 names=
属性中设置该名称。 (请注意下面示例中 fig.line
字形的 name=
属性。
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')