NetworkX绘制multigraph时无法显示边标签如何解决
解决方案
方案1:使用NetworkX原生绘图实现边标签显示
原代码的核心问题有两个:
- 构造图时未将
relation列作为边属性存储,导致后续无法读取边标签 - 没有调用专门的边标签绘制接口
修正后的完整可运行代码如下:
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
相关产品推荐
相关产品推荐

