使用Pyvis在交互式Networkx图中显示节点和边属性

0 投票
0 回答
49 浏览
提问于 2025-04-12 09:40

编辑

我把 pyvis 更新到了 0.3.2 版本,现在图表运行正常了。

如果你对在 Pyvis 中显示 Networkx 图的节点和边的属性感兴趣,可以继续往下看。


原始问题

我有两个 Pandas 数据框:edges_dfnodes_df。我用它们创建了一个 networkx 图 G,然后把这个图传给了 Pyvis 网络。

edges_df 的内容如下:

目标 颜色 标题
140 1 3 #379951 T/B
146 5 15 #379951 T/B
7 1 2 #0b03fc 78
0 0 1 #0b03fc 62
139 4 10 #379951 T/B

nodes_df 的内容如下:

ID 颜色 标题
1 1 #47abfc 我是节点 1
15 15 #47abfc 我是节点 15
14 14 #f24e77 我是节点 14
2 2 #f24e77 我是节点 2
8 8 #f24e77 我是节点 8

我创建 G 的代码如下:

# Declare nx graph from pandas edges
G = nx.from_pandas_edgelist(
    df=edges_df,
    source='src',
    target='dst',
    edge_attr=['color', 'title']
)

# Set node attributes from pandas
nx.set_node_attributes(
    G=G,
    values=nodes_df_renamed.set_index('id').to_dict('index')
)

文档中提到:

请注意,Networkx 节点属性与 pyvis 使用的属性名称相同(例如,title)的情况下,会直接转换为相应名称的 pyvis 节点属性。

因此,我认为如果我的 networkx 图有符合 pyvis 命名规则的节点属性,生成的图就会自动显示每个节点的属性。

然而,当我从 G 构建一个 pyvis Network 时,生成的图并没有按预期显示颜色或标题。例如,我本来希望节点 1 是蓝色(#47abfc),并且当用户悬停在上面时显示字符串 '我是节点 1'

# Imports
from pyvis import network as net
import networkx as nx
from IPython.display import HTML

# Declare pyvis graph from G
gpv = net.Network(notebook=True, cdn_resources='in_line')
gpv.from_nx(G)
gpv.save_graph('example.html')
HTML(filename='example.html')

可惜的是,我的边和节点的 titlecolor 属性都没有按预期显示。

这里输入图片描述

我该如何让 Pyvis 根据我的 networkx 图的相应属性来渲染节点和边呢?

我正在处理的数据非常庞大(有 250 亿条边),我希望避免使用循环一个一个添加节点或边。


总结

通过创建一个符合 Pyvis 命名规则 的 Networkx 图,生成的可视化将继承 Networkx 图的属性。

例如,添加节点属性 title 将导致悬停时显示相应节点的标题。

成功

0 个回答

暂无回答

撰写回答