为什么 networkx 每次运行重绘我的图形都不一样?

ACL*_*ACL 5 python graph-theory networkx

我想绘制一个图形,边代表节点之间的相关系数。我对每一种独特的关系都有优势。每次我重新运行以下代码时,图表都不同。有没有办法强制图形的一种形式?此外,不确定这是否甚至正确生成了图表 - 请帮助解决任何看起来错误的问题。

G = nx.Graph()
G.add_edge('A', 'B', weight=0.511012)
G.add_edge('A', 'C', weight=0.553063)
G.add_edge('A', 'D', weight=0.607859)
G.add_edge('A', 'E', weight=0.601554)
G.add_edge('A', 'F', weight=0.641796)

G.add_edge('B', 'C', weight=0.438743)
G.add_edge('B', 'D', weight=0.463087)
G.add_edge('B', 'E', weight=0.615150)
G.add_edge('B', 'F', weight=0.478853)

G.add_edge('C', 'D', weight=0.553063)
G.add_edge('C', 'E', weight=0.438743)
G.add_edge('C', 'F', weight=0.541893)

G.add_edge('D', 'E', weight=0.535331)
G.add_edge('D', 'F', weight=0.556995)

G.add_edge('E', 'F', weight=0.535446)

nx.draw(G, with_labels=True, node_color='orange', node_size=400, edge_color='black', linewidths=1, font_size=15)
plt.show()
Run Code Online (Sandbox Code Playgroud)

Joe*_*oel 8

默认nx.draw用途nx.spring_layout设置节点的位置。除非将种子输入nx.spring_layout,否则它会从随机初始条件开始,然后使用基于将边缘视为弹簧和节点视为质量的运动来重新定位节点。由于这种随机的初始条件,每次的位置都会不同。

然而,通常我们可能想要使用多个绘图命令来绘制节点或边(例如,如果我们想要一些节点采用一种尺寸或样式而其他节点采用另一种尺寸或样式)。为此,nx.draw接受一个可选参数pos,它是一个字典,其键是节点,其值是给出它们的 (x,y) 坐标的 2 元组。Networkx 有几个函数使用不同的规则分配位置,正如我上面所说的,默认使用随机初始条件,因此每次都会给出不同的输出。

在您的情况下,您希望确保每次运行代码时网络都被赋予相同的位置。因此,您应该向设置位置的命令提供种子。

#code to generate graph G here.
my_pos = nx.spring_layout(G, seed = 100)
nx.draw(G, pos = my_pos, with_labels=True, node_color='orange', node_size=400, edge_color='black', linewidths=1, font_size=15)
plt.show()
Run Code Online (Sandbox Code Playgroud)

可以允许边缘的权重导致弹簧布局表现得好像更高的权重是更强的弹簧。查看spring_layout文档以获取更多详细信息。