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算法,这将导致一致的最终输出。 (如果需要的话,甚至可以指定不允许更改位置的某些节点)。 或者,您可以使用可选参数
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') |
文档在这里可用。 源代码可以在这里找到。
如果要消除轴,请查看nx.draw。
请注意,除了我所做的以外,还有其他方法可以添加加权边。
根据文档,
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) |