I\'ve created a visual graph using Bokeh that shows a network I created using Networkx. I now want to use TapTool to show information pertinent to any node on the graph that
The problem is that the callback is not attached to a data source. The value of cb_obj
is whatever object triggers the callback. But only ColumnDataSource
objects have a selected
property, so only callbacks on data sources will have cb_obj.selected
. If you are wanting to have a callback fire whenever a selection changes, i.e. whenever a node is clicked on, then you'd want to have the callback on the data source. [1]
However, if you want to have a callback when a node is merely hovered over (but not clicked on) that is an inspection, not a selection. You will want to follow this example:
https://docs.bokeh.org/en/latest/docs/user_guide/interaction/callbacks.html#customjs-for-hover
Although it is not often used (and thus not documented terribly well) the callback for hover tools gets passed additional information in a cb_data
parameter. This cb_data
parameter is used as a catch-all mechanism for tools to be able to pass extra things, specific to the tool, on to the callback. In the case of hover tools, cb_data
is an object that has .index
and .geometry
attributes. So cb_data.index['1d'].indices
has the indices of the points that are currently hovered over. The .geometry
attribute as information about the kind of hit test that was performed (i.e. was a single point? or a vertical or horizontal span? And what was the location of the point or span?)
[1] Alternatively, tap tools also pass a specialized cb_data
as described above. It is an object with a .source
property that the the data source that made a selection. So cb_data.source.selected
should work. In practice I never use this though, since a callback on the data source works equally well.