关于python:具有不同边值的Networkx Spring布局

Networkx Spring Layout with Different Edge Values

我是Networkx的新手,试图弄清楚如何使用弹簧布局,但在节点之间应用不同的边值(即,节点之间的距离不同),而不是使用相同的边值。

本质上,我想要一个图,该图尝试保持一组预定义的节点到节点的距离(可能使用弹簧布局来查找一些局部最小值),并且某些边缘的权重高于其他边缘。 但是,Networkx文档建议所有边缘的重量相同。

此外,在绘制spring_layout图的简单情况下,我注意到生成的图每次运行时都会改变构象。 有没有办法找回同一张图(即设置一些随机种子)?

1
2
3
import networkx as nx
G = nx.path_graph(5)
nx.draw(G)


您可以(几乎)完成所追求的目标。

1)您可以预定义一些会影响节点距离的权重。 (但是您不能直接指定距离)

2)您可以将初始位置输入spring_layout算法,这将导致一致的最终输出。 (如果需要的话,甚至可以指定不允许更改位置的某些节点)。 或者,您可以使用可选参数seed将种子分配给nx.spring_layout使用的随机数生成器。

1
2
3
4
5
6
7
8
9
10
11
12
import networkx as nx

G = nx.Graph()
G.add_edges_from([(1,2, {'myweight':20}), (2,3,{'myweight':0.1}),
                  (1,4,{'myweight':1}), (2,4,{'myweight':50})])
initialpos = {1:(0,0), 2:(0,3), 3:(0,-1), 4:(5,5)}
pos = nx.spring_layout(G,weight='myweight', pos = initialpos)

nx.draw_networkx(G,pos)

import pylab as plt
plt.savefig('test.png')

enter image description here

文档在这里可用。 源代码可以在这里找到。

如果要消除轴,请查看nx.draw。

请注意,除了我所做的以外,还有其他方法可以添加加权边。


根据文档,spring_layout采用weight-关键字,它是应用布局时用作权重的edge属性的名称。 一个例子:

1
2
3
4
5
6
7
8
9
10
import networkx as nx
import random
G = nx.path_graph(5)

# Add some random weights (as dictonary with edges as key and weight as value).
nx.set_edge_attributes(G, 'my_weight', dict(zip(G.edges(), [random.random()*10 for edge in G.edges()])))

# Apply layout using weights.
pos = nx.spring_layout(G, weight='my_weight')
nx.draw(G, pos)