2015-04-22 72 views
1

我是Networkx的新手,並試圖找出如何使用彈簧佈局,但在節點之間應用不同的邊緣值(即節點之間的不同距離),而不是相同的邊緣值。基本上,我想要一個圖表,它試圖保持一組預定義的節點距離(可能使用彈簧佈局來查找某些局部最小值),而某些邊的權重高於其他邊。但是,Networkx文檔建議所有邊都具有相同的權重。Networkx具有不同邊緣值的彈簧佈局

此外,在繪製spring_layout圖形的簡單情況下,我注意到每次運行結果圖形都會改變構形。有沒有辦法讓相同的圖回來(即設置一些隨機種子)?

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

回答

2

你可以完成你所追求的(幾乎)。

1)您可以預先定義一些會影響節點距離的權重。 (但不能直接指定距離)

2)您可以將初始位置輸入到spring_layout算法中,這將導致一致的最終輸出。 (你甚至可以指定某些不允許改變位置的節點)。

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

文件可here。源代碼可以在here找到。

看看nx.draw,如果你想擺脫斧頭。

請注意,還有其他方法可以添加加權邊緣,而不僅僅是我所做的。

+0

重量是否與潛力成反比,是否等同於胡克定律中的力常數?我看到邊的「長度」屬性,並希望儘可能接近我的預設長度(即找到允許我將節點放置爲與預設長度類似的局部最小值)。 – slaw

+0

有一些解釋[這個答案]是怎麼回事(http://stackoverflow.com/questions/28934505/networkx-spring-layout-edge-weights?rq=1)。這些基本上是彈簧常數,但不能保證它在給定位置時處於最小值。使用的確切算法是Fruchterman-Reingold。如果你花一點時間閱讀它,你會很快知道比我更多的東西。 – Joel

1

根據documentationspring_layout需要weight -keyword這是在應用佈局時用作權重的邊緣屬性的名稱。舉例:

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)