如何使用NetworkX为图的边添加邻接矩阵数值标签?
给有向图边添加邻接矩阵数值标签的实现方法
要给图中边添加对应邻接矩阵的数值标签,需要修改Python代码,把权重值作为边属性传入图结构,再在导出dot文件时设置标签。具体操作如下:
- 提取符合条件的边及其对应的权重值:不再只获取行和列索引,同时提取邻接矩阵中对应位置的数值。
- 构建带权重属性的边列表:将权重作为字典属性添加到每条边中。
- 导出dot文件时为边设置标签:遍历所有边,把权重值设为边的标签文本。
修改后的完整代码:
import numpy as np import networkx as nx from networkx.drawing.nx_pydot import to_pydot # 定义邻接矩阵 adj = np.array([ [ 0, 0, 7, 0, 0, 0, 2, 1, 0, 0], [ 0, 0, 5, 10, 8, 10, 4, 62, 13, 1], [ 7, 5, 0, 17, 13, 90, 3, 10, 0, 1], [ 0, 10, 17, 0, 2, 11, 218, 20, 0, 0], [ 0, 8, 13, 2, 0, 2, 0, 30, 0, 0], [ 0, 10, 90, 11, 2, 0, 4, 43, 9, 0], [ 2, 4, 3, 218, 0, 4, 0, 11, 0, 0], [ 1, 62, 10, 20, 30, 43, 11, 0, 2, 2], [ 0, 13, 0, 0, 0, 9, 0, 2, 0, 1], [ 0, 1, 1, 0, 0, 0, 0, 2, 1, 0] ]) count = 10 # 获取满足条件的行、列索引及对应权重 rows, cols = np.where(adj > count) weights = adj[rows, cols] # 构造带权重属性的边列表 edges = [(rows[i], cols[i], {'weight': weights[i]}) for i in range(len(rows))] G = nx.DiGraph() G.add_edges_from(edges) # 转换为pydot并设置边标签 p = to_pydot(G) for edge in p.get_edges(): # 获取边的起点和终点(注意pydot返回的是字符串,需转整数) u = int(edge.get_source()) v = int(edge.get_destination()) # 从图中取出权重值并设置为边标签 edge.set_label(str(G[u][v]['weight'])) p.write_dot('test.dot')
运行以上代码后,导出的test.dot文件中每条边都会带有对应的数值标签,再执行你原来的dot命令生成图片即可看到效果,比如5->7和7->5的边会分别标注邻接矩阵中对应的43和43。
内容的提问来源于stack exchange,提问作者Mike Yearworth
相关产品推荐
相关产品推荐

