Networkx节点在完整图中的定位

Networkx node positioning in a complete graph

我想用 networkx 库画一个无向的、带权的、完整的图。我的目标是以边缘权重代表节点之间的距离的方式绘制此图。

例如,考虑下面的节点和边集:

A、B、权重=5.0

A、C、权重=50.0

B、C、权重=0.5

此时A-C距离最小,B-C距离最大

我能够用(在向 G 中添加边和节点之后)绘制它

nx.draw(G, pos=None)

但是,随着节点数量的增加(超过 6 个),会出现不一致的情况。我的意思是有些节点靠得更近了,尽管连接它们的边的权重很低。

我假设某些节点位置在某个时间点后不会更新,但我不确定。

有什么建议吗?

您可以生成图表的布局,并根据布局计算距离。然后,您可以将 1/距离指定为边权重。靠近的边缘将具有更强的连接,更远的边缘将具有更弱的连接。

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

G = nx.complete_graph(15)

# generate positions
pos = nx.spring_layout(G)

# calculate distances and store as weights
from scipy.spatial.distance import euclidean
edge_updates = {}
edge_widths = []
for (a,b,_) in G.edges(data=True): 
    distance = euclidean(pos[a], pos[b])
    edge_updates[a,b] = {'distance': distance}
    edge_widths.append(1/distance)
nx.set_edge_attributes(G, edge_updates)



nx.draw_networkx_nodes(G, pos=pos)
a = nx.draw_networkx_edges(G, pos=pos, edge_cmap=plt.cm.magma, width=edge_widths)