为什么Networkx每次运行时都会重新绘制不同的图表?

2022-03-31 00:00:00 python networkx graph-theory

问题描述

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

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()

解决方案

默认为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()
可以允许边的权重使弹簧布局的作用就像较高的权重是较强的弹簧一样。有关更多详细信息,请查看documentation of spring_layout。

相关文章