如何使用networkx绘制图并展示预先计算的节点对之间的距离
使用自定义节点距离绘制NetworkX图的方法
你当前默认绘制的节点位置不符合预期,是因为nx.draw()默认调用自动布局算法,没有使用你提前计算的节点对距离,按以下步骤修改代码即可:
步骤1:准备距离矩阵并生成坐标
首先用**多维缩放(MDS)**算法将你提前计算好的20×20节点距离矩阵转换为二维平面坐标,该算法可以保证平面上节点的相对距离和你计算的原始距离尽可能匹配。
import networkx as nx import torch_geometric from sklearn.manifold import MDS import matplotlib.pyplot as plt # 你的原有逻辑:从pyg数据转networkx图 g = torch_geometric.utils.to_networkx(data, to_undirected=True) # --------------- 新增部分开始 --------------- # 替换为你自己提前计算好的20*20距离矩阵,dist_matrix[i][j]为节点i和节点j的距离 dist_matrix = 你提前计算的距离矩阵变量 # 用MDS将距离矩阵降为2维坐标,random_state固定保证每次生成的布局一致 mds = MDS(n_components=2, dissimilarity='precomputed', random_state=42) pos = mds.fit_transform(dist_matrix) # 转成networkx要求的坐标格式:{节点id: (x坐标, y坐标)} pos = {i: pos[i] for i in range(g.number_of_nodes())} # 如果需要在边上显示节点对距离,先把距离添加为边属性 for u, v in g.edges(): g.edges[u, v]['distance'] = dist_matrix[u][v] # --------------- 新增部分结束 ---------------
步骤2:使用自定义坐标绘图
# 绘制节点和标签 nx.draw(g, pos=pos, with_labels=True, node_color='lightblue') # (可选)绘制边的距离标签 edge_labels = nx.get_edge_attributes(g, 'distance') nx.draw_networkx_edge_labels(g, pos=pos, edge_labels=edge_labels, font_size=8) plt.show()
你之前默认生成的随机布局效果参考:
注意:如果你的距离仅针对存在边的节点对,不是完整的全节点距离矩阵,也可以直接修改弹簧布局的权重参数:
pos = nx.spring_layout(g, weight='distance'),把边的距离作为权重传入即可,弹簧布局会自动根据边权重调整节点间距。
内容的提问来源于stack exchange,提问作者Samah wa
相关产品推荐
相关产品推荐

