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)
我想用 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)