源节点和目标节点的 Bokeh 不同悬停

Bokeh Different Hovers for source and target nodes

我使用来自 df 的 Bokeh networkx 创建了一个网络图:

df = pd.DataFrame('source': [1,2,3], 'target': ['a', 'b', 'c], 'name': ['a1', 'b2', 'c3'])

使用第 source 列的源节点和 target

列的目标节点

有没有办法显示

的悬停
HoverTool(tooltips = [("SOURCE", "$source"), ("NAME", "$name")])

对于 'source' 个节点和

HoverTool(tooltips = [("TARGET", "$target")])

对于目标节点?

我的代码如下:

import pandas as pd
from bokeh.io import show
import networkx as nx
from bokeh.models import Plot, MultiLine, Circle
from bokeh.models.graphs import from_networkx
net_graph = networkx.from_pandas_edgelist(df, 'source', 'target', 'name')
for index, row in df.iterrows():
    net_graph.nodes[row['source']]['source_hover'] = row['source']
    net_graph.nodes[row['source']]['name hover'] = row['name']
    net_graph.nodes[row['target']]['target hover'] = row['target']
graph_plot = Plot(plot_width = 800, plot_height = 600, x_range = Range1d(-1.1, 1.1), y_range = Range1d(-1.1, 1.1))
graph_setup = from_networkx(net_graph, nx.spring_layout, scale = 1, center = (0, 0))
graph_plot.add_tools(HoverTool(renderers=[graph_setup], tooltips=[("SOURCE", "@source_hover"), ("NAME", "@name_hover")]))
graph_plot.add_tools(HoverTool(renderers=[graph_setup], tooltips=[("TARGET", "@target_hover")]))
graph_setup.node_renderer.glyph = Circle(size = 20, fill_color = 'red')
graph_setup.edge_renderer.glyph = MultiLine(line_color = "grey", line_alpha = 0.8, line_width = 1)
graph_plot.renderers.append(graph_setup)
show(graph_plot)

你可以根据你的图表更改下面的渲染器,或者如果你有不同的字形,你可以添加 p、p2 等。我帮不上什么忙,因为你的意图不明确,而且我们没有你的代码。

p.add_tools(HoverTool(renderers=[], tooltips=[("SOURCE", "$source"), ("NAME", "$name")])
p.add_tools(HoverTool(renderers=[], tooltips=[("TARGET", "$target")])

renderers=[] 部分将帮助您做到这一点。渲染器基本上是你的 lines/bars 等。因为上面你有 Multiline(其中有渲染器列表)和 Circle。所以基本上对于圆图只使用 renderers[]

比如圆圈先给个名字:

circlename = Circle(size = 20, fill_color = 'red')

并在悬停工具中添加 renderers=[circlename]

MultiLine 部分有点棘手。你有多条线。所以你必须给所有的人起名字。您基本上可以使用字典和 for 循环来命名。并且可以像上面那样在渲染器部分中确定。您可以从 here

查看