为什么 networkx 每次 运行 都会重绘我的图表?
Why does networkx redraw my graph different each run?
我想画一个图,边代表节点之间的相关系数。我对每一种独特的关系都有优势。每次我重新运行以下代码时,图形都不一样。有没有办法强制使用一种形式的图表?另外,不确定这是否能正确生成图表 - 请帮助解决任何看起来不对的问题。
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()
您的代码构建了一个完整的图。 NetworkX 不对其可视化图形的方式负责,而是对您使用的下划线库负责;在这种情况下是 matplotlib。您可以检查是否可以通过该库定义一些基元,以某种方式为每个 运行 保留相同的图形。
此外,请记住,NetworkX 不是 documentation 中的图形可视化工具。
NetworkX provides basic functionality for visualizing graphs, but its
main goal is to enable graph analysis rather than perform graph
visualization. In the future, graph visualization functionality may be
removed from NetworkX or only available as an add-on package.
默认nx.draw
使用nx.spring_layout
来设置节点的位置。除非将种子输入 nx.spring_layout
,否则它从随机初始条件开始,然后使用基于将边缘视为 springs 并将节点视为质量的运动来重新定位节点。由于这个随机的初始条件,每次的位置都会不同。
然而,我们通常可能希望使用多个绘图命令来绘制节点或边(例如,如果我们想要一些节点采用一种尺寸或样式,而其他节点采用另一种尺寸或样式)。为此,nx.draw
接受一个可选参数 pos
,它是一个字典,其键是节点,其值是给出其 (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()
允许边的权重使 spring 布局表现得好像权重越高越强 spring 是可能的。查看 documentation of spring_layout 了解更多详情。
我想画一个图,边代表节点之间的相关系数。我对每一种独特的关系都有优势。每次我重新运行以下代码时,图形都不一样。有没有办法强制使用一种形式的图表?另外,不确定这是否能正确生成图表 - 请帮助解决任何看起来不对的问题。
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()
您的代码构建了一个完整的图。 NetworkX 不对其可视化图形的方式负责,而是对您使用的下划线库负责;在这种情况下是 matplotlib。您可以检查是否可以通过该库定义一些基元,以某种方式为每个 运行 保留相同的图形。
此外,请记住,NetworkX 不是 documentation 中的图形可视化工具。
NetworkX provides basic functionality for visualizing graphs, but its main goal is to enable graph analysis rather than perform graph visualization. In the future, graph visualization functionality may be removed from NetworkX or only available as an add-on package.
默认nx.draw
使用nx.spring_layout
来设置节点的位置。除非将种子输入 nx.spring_layout
,否则它从随机初始条件开始,然后使用基于将边缘视为 springs 并将节点视为质量的运动来重新定位节点。由于这个随机的初始条件,每次的位置都会不同。
然而,我们通常可能希望使用多个绘图命令来绘制节点或边(例如,如果我们想要一些节点采用一种尺寸或样式,而其他节点采用另一种尺寸或样式)。为此,nx.draw
接受一个可选参数 pos
,它是一个字典,其键是节点,其值是给出其 (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()
允许边的权重使 spring 布局表现得好像权重越高越强 spring 是可能的。查看 documentation of spring_layout 了解更多详情。