为什么networkx在每次运行时重画我的图都不同?

时间:2018-12-12 01:30:09

标签: 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()

2 个答案:

答案 0 :(得分:1)

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

但是,通常,我们可能想使用多个绘制命令来绘制节点或边(例如,如果我们希望某些节点使用一种尺寸或样式,而另一些节点使用另一种尺寸或样式)。为此,nx.draw接受一个可选参数pos,这是一个字典,其字典为键,节点为2元组,给出其(x,y)坐标。 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以获得更多详细信息。

答案 1 :(得分:0)

您的代码构建了一个完整的图形。 NetworkX对其图形的可视化方式不承担任何责任,而是您所使用的下划线库。在这种情况下,请使用matplotlib。您可以检查是否可以通过该库定义一些原语,以某种方式为每次运行保留相同的图形。

此外,请记住,根据documentation,NetworkX并不是用于图形可视化的工具。

  

NetworkX提供了可视化图形的基本功能,但是它具有   主要目标是启用图分析而不是执行图   可视化。将来,图形可视化功能可能会   从NetworkX中删除或仅作为附加软件包提供。