使用PyVis可视化DGL加载的Cora数据集时触发AssertionError
问题说明
使用DGL加载Cora图数据集,转换为NetworkX Graph对象后传入PyVis执行可视化时触发AssertionError,最小复现代码如下:
import dgl from pyvis.network import Network import networkx as nx dataset = dgl.data.CoraGraphDataset() g = Network(height=800, width=800, notebook=True) netxG = nx.Graph(dataset[0].to_networkx()) g.from_nx(netxG) g.show('ex.html')
报错根因
DGL的to_networkx()方法默认会把节点、边挂载的所有特征(包括feat特征张量、label标签张量)同步到NetworkX图的节点/边属性中,PyVis的from_nx()方法仅支持JSON可序列化的Python原生类型属性(字符串、数字、布尔值),遇到张量、numpy数组类型的属性时,内部属性校验逻辑会直接触发断言失败。
修复方案
- 调用DGL的
to_networkx()方法时,通过node_attrs、edge_attrs参数指定需要保留的属性,不需要的张量特征直接丢弃,仅保留图结构即可规避类型不兼容问题。 - 如果需要给节点添加分类配色、悬停提示等可视化属性,先将张量/数组值转换为Python原生的int、str类型后再挂载到NetworkX节点上。
修正后可直接运行的代码:
import dgl from pyvis.network import Network import networkx as nx dataset = dgl.data.CoraGraphDataset() dgl_g = dataset[0] # 转换时不携带任何张量类型的节点、边特征,仅保留图拓扑结构 netxG = nx.Graph(dgl_g.to_networkx(node_attrs=[], edge_attrs=[])) # 按需添加原生类型的节点属性用于可视化 node_labels = dgl_g.ndata['label'].tolist() for nid in netxG.nodes: netxG.nodes[nid]['group'] = node_labels[nid] # 按标签分组自动配色 netxG.nodes[nid]['title'] = f"节点分类: {node_labels[nid]}" # 鼠标悬停提示 g = Network(height=800, width=800, notebook=True) g.from_nx(netxG) # 可选:显示布局调节按钮 g.show_buttons(filter_=['physics']) g.show('ex.html')
补充提示:Cora全量图包含2708个节点、10556条边,直接全量渲染加载速度较慢,测试时可先取子图验证,例如取前500个节点生成子图:
sub_g = netxG.subgraph(list(netxG.nodes)[:500]),再传入PyVis处理即可。
内容的提问来源于stack exchange,提问作者Des
相关产品推荐
相关产品推荐

