You need to enable JavaScript to run this app. NetworkX绘制multigraph时无法显示边标签如何解决
优惠活动
大模型
产品
解决方案
定价
更多

NetworkX绘制multigraph时无法显示边标签如何解决

解决方案

方案1:使用NetworkX原生绘图实现边标签显示

原代码的核心问题有两个:

  1. 构造图时未将relation列作为边属性存储,导致后续无法读取边标签
  2. 没有调用专门的边标签绘制接口

修正后的完整可运行代码如下:

import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt

minidf = pd.DataFrame(data={'relation': ['subject', 'subject', 'broader'], 
                       'source': ['pmt3423', 'pmt2040', 'category:myoblasts'], 
                       'target': ['conceito', 'frio', 'category:non-terminally_differentiated_(blast)']})
# 新增edge_attr参数,将relation存入边属性
miniG = nx.from_pandas_edgelist(minidf,'source', 'target',
                      edge_key='relation', edge_attr='relation', create_using=nx.MultiDiGraph())

# 固定布局坐标,保证节点和边标签位置对齐
pos = nx.spring_layout(miniG, seed=42)
# 绘制节点、边、节点标签
nx.draw_networkx(miniG, pos=pos, with_labels=True, node_size=3000, font_size=8)
# 读取边的relation属性作为标签
edge_labels = nx.get_edge_attributes(miniG, 'relation')
# 绘制边标签
nx.draw_networkx_edge_labels(miniG, pos=pos, edge_labels=edge_labels, font_size=7)

plt.axis('off')
plt.show()

方案2:使用Pyvis生成带边标签的交互知识图谱

Pyvis生成的网页版图谱支持缩放、拖拽节点,更适合知识图谱浏览,正确配置代码如下:

import pandas as pd
import networkx as nx
from pyvis.network import Network

minidf = pd.DataFrame(data={'relation': ['subject', 'subject', 'broader'], 
                       'source': ['pmt3423', 'pmt2040', 'category:myoblasts'], 
                       'target': ['conceito', 'frio', 'category:non-terminally_differentiated_(blast)']})
miniG = nx.from_pandas_edgelist(minidf,'source', 'target',
                      edge_key='relation', edge_attr='relation', create_using=nx.MultiDiGraph())

# 初始化有向图,非Jupyter环境可将notebook参数改为False
net = Network(directed=True, notebook=True, height='800px', width='100%')
net.from_nx(miniG)
# 给所有边设置显示标签
for edge in net.edges:
    edge['label'] = edge['relation']
    edge['font.size'] = 10

# 生成HTML文件,打开即可查看带边标签的交互图谱
net.show('knowledge_graph.html')

方案3:Graphviz+neato渲染带边标签的静态图

之前生成dot文件无标签是因为未给边设置label属性,修正代码如下:

import pandas as pd
import networkx as nx

minidf = pd.DataFrame(data={'relation': ['subject', 'subject', 'broader'], 
                       'source': ['pmt3423', 'pmt2040', 'category:myoblasts'], 
                       'target': ['conceito', 'frio', 'category:non-terminally_differentiated_(blast)']})
miniG = nx.from_pandas_edgelist(minidf,'source', 'target',
                      edge_key='relation', edge_attr='relation', create_using=nx.MultiDiGraph())

# 给边添加label属性,导出dot时会自动识别
for u, v, data in miniG.edges(data=True):
    data['label'] = data['relation']

# 导出dot文件
nx.nx_pydot.write_dot(miniG, 'kg.dot')

导出dot文件后执行命令渲染即可得到带边标签的图片:
neato -Tpng kg.dot -o kg.png

内容的提问来源于stack exchange,提问作者DSchlingel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 06:00:05