2013-10-25 92 views
2

我正在使用Networkx中的有向圖,我需要將它分成兩部分。該圖表示重組三叉樹,並且在構建它之後,我需要使用節點上的值進行一些計算。Python的Networkx:添加重複或相等的節點到樹/圖?

我的問題是,我在應用程序上工作,需要我檢查一個節點並「拆分」樹。我需要重複節點值,因爲它們在圖上的位置對我來說很重要,而不是節點本身的值。注意:重命名節點(即改變節點10到10a)是不可行的,因爲我必須稍後對這些數字進行計算。

舉個例子:

 80 
     | 
    100 
/| \ 
50 100 150 

,我需要到結束:

  80 
    / \  
     100  100 
    /|  | 
    50 100  150 

有沒有辦法做到這一點不重新命名節點???謝謝!

+0

東奔西走兒子節點創建'根 - > first_son''根 - > second_son'。 –

+0

對不起,我不明白你說什麼。我無法讓Python做重複的節點。 – Oniropolo

+0

@MiguelHerschberg一種選擇是將實際值例如:'100'作爲節點的屬性,但具有不同的節點以形成邊緣。 (所以,在你的例子中,這裏的兩個100將是100a和100b,但都具有用於計算的100的屬性) –

回答

1

你可以給節點添加值嗎?一些重組可能是不可避免的。 value可以是任何東西,這樣可以讓你保持節點你已經有了和區分它們...

import matplotlib.pyplot as plt 
import networkx as nx 

G=nx.DiGraph() 
G.add_node(1,value=80) 
G.add_node(2,value=100) 
G.add_node(3,value=50) 
G.add_node(4,value=100) 
G.add_node(5,value=150) 
G.add_node(6,value=100) 
G.add_node(7) 
G.add_node(8) 
G.add_edges_from([(1,2),(2,3),(2,4),(1,6),(6,5)]) 

# change the value of nodes 
for i in G: 
    if 'value' in G.node[i]: 
     # do something? 
     continue 
    else: 
     G.node[i]['value']=200 


labels={} 
for i in G: 
    labels[i]=G.node[i]['value'] 
pos=nx.circular_layout(G) 

nx.draw_circular(G,node_size=1000,node_color='r',node_shape='s',with_labels=False) 
nx.draw_networkx_labels(G,pos,labels,font_size=12) 
plt.show()