2015-11-02 98 views
2

我想比較兩個使用networkx庫的圖形。 我想嘗試包含3個節點的硬編碼示例。其中一個圖形被引用,所以我想檢查第二個圖形中的邊緣是否在同一個位置。我正在考慮簡單的算法,它會從給定的圖中減去參考圖,如果結果不是空圖,則返回false。計算網絡中兩個圖形邊緣之間的差異

我的代碼如下,但它不工作:

import networkx as nx 
import matplotlib.pyplot as plt 


S=nx.DiGraph()#S-sample graph 

S.add_nodes_from([0,1,2]) 
S.add_edge(0,2) 
S.add_edge(1,2) 

nx.draw(S) 
#plt.savefig("S.png") 
#plt.show() 

R=nx.DiGraph()#R-reference graph 

R.add_nodes_from([0,1,2]) 
R.add_edge(1,2) 

nx.draw(R) 
#plt.savefig("R.png") 
#plt.show() 

def difference(S, R): 
    DIF=nx.create_empty_copy(R) 
    DIF.name="Difference of (%s and %s)"%(S.name, R.name) 
    if set(S)!=set(R): 
    raise nx.NetworkXError("Node sets of graphs is not equal") 

# if S.is_multipgraph(): 
# edges=S.edges_iter(keys=True) 
# else: 
    edges=S.edges_iter() 
    for e in edges: 
    if not R.has_edge(*e): 
     DIF.add_edge(*e) 
    return DIF 

D=difference(S, R) 
plt.show(D) 
+1

S.edges())!= set(R.edges())'? – Ward

+0

我可以這樣做,但我仍然需要指出有什麼區別 – Mikul

+0

將差異的邊緣添加到您的新DiGraph? (sedges())的差異(seted(R.edges())):DIF.add_edge(e)' – Ward

回答

2

你想計算一個圖形(DIF)的邊緣在你的參考(R)圖中,但不是在你的輸入圖(S)? 或者你想計算一個R和S之間不同邊的圖嗎?我包括了兩個選項,其中一個被註釋掉了。

import networkx as nx 

S = nx.DiGraph()#S-sample graph 
S.add_nodes_from([0, 1, 2]) 
S.add_edge(0, 2) 
S.add_edge(1, 2) 

R = nx.DiGraph()#R-reference graph 
R.add_nodes_from([0, 1, 2]) 
R.add_edge(1, 2) 


def difference(S, R): 
    DIF = nx.create_empty_copy(R) 
    DIF.name = "Difference of (%s and %s)" % (S.name, R.name) 
    if set(S) != set(R): 
     raise nx.NetworkXError("Node sets of graphs is not equal") 

    r_edges = set(R.edges_iter()) 
    s_edges = set(S.edges_iter()) 

    # I'm not sure what the goal is: the difference, or the edges that are in R but not in S 
    # In case it is the difference: 
    diff_edges = r_edges.symmetric_difference(s_edges) 

    # In case its the edges that are in R but not in S: 
    # diff_edges = r_edges - s_edges 

    DIF.add_edges_from(diff_edges) 

    return DIF 

print(difference(S, R).edges()) 

這個版本打印[(0, 2)]

由於@Joel注意到,在無向圖,有沒有擔保:(至少我沒有在源或文檔找到它)的節點的順序將是一致的。如果這是一個問題,你可以先將元組轉換成frozensets,所以順序無關緊要。你需要frozensets,而不是集合和列表,因爲這些都是可哈希(這是一組的成員要求),如果你想的邊緣,你爲什麼不使用`如果設置(比較

set([frozenset(x) for x in S.edges()]) 
0

一種簡單的方式來寫它是raise nx.Networkx...線後如下(您差分法的一部分

for edge in S.edges_iter(): 
     if not R.has_edge(edge[0],edge[1]): 
      DIF.add_edge(edge[0],edge[1]) 
    return DIF; 

而且這是圖我對你的例子:

enter image description here

正如@joel所提到的,我通過邊緣[0]與邊緣[1]交換來測試它的無向圖,並且它工作正常。

至於你的代碼,我相信你唯一的問題是顯示圖形。

第一個要在單獨的圖中顯示每個圖表,您必須在每次繪製之後執行plt.show()

在你寫plt.show(D)的最後一行是不正確的做法,你必須使用繪製函數然後調用plt.show()

最後,對drawing documentation一看,你有其他的抽獎功能,你可以自定義繪製的圖形,例如nx.draw_networkx_nodes節點的形狀,顏色,大小...

+0

如何在節點中添加數字? – Mikul

+0

你的意思是在顯示器上?簡單地使用with_labels = True作爲draw函數,如下所示:'nx.draw(D,with_labels = True)' –

相關問題