2015-09-18 63 views
12

說我有兩個networkx圖表,GH合併(加入)networkx圖表

G=nx.Graph() 
fromnodes=[0,1,1,1,1,1,2] 
tonodes=[1,2,3,4,5,6,7] 
for x,y in zip(fromnodes,tonodes): 
    G.add_edge(x,y) 

H=nx.Graph() 
fromnodes=range(2,8) 
tonodes=range(8,14) 
for x,y in zip(fromnodes,tonodes): 
    H.add_edge(x,y) 

什麼是加入兩個networkx圖的最佳方式?

我想保留節點名稱(注意公共節點,2到7)。當我用nx.disjoint_union(G,H),這並沒有發生:

>>> G.nodes() 
[0, 1, 2, 3, 4, 5, 6, 7] 
>>> H.nodes() 
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
>>> Un= nx.disjoint_union(G,H) 
>>> Un.nodes() 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 
# 

H節點標籤被改變(不是我想要的)。我想要在具有相同編號的節點上加入圖形。

注意。這不是Combine two weighted graphs in NetworkX的重複。

+1

如果兩個邊都存在,你想怎麼做?它應該成爲雙刃?或者只是一個邊緣? – Joel

+0

@Joel嗯我對這兩種情況都很感興趣。讓我們說單邊。 – atomh33ls

+1

單邊的情況是由你寫的代碼處理好的。你可以用'U = nx.MultiGraph()' – Joel

回答

23

你要找的功能是compose

import networkx as nx 
G=nx.Graph() 
G.add_edge(1,2) 
H=nx.Graph() 
H.add_edge(1,3) 
F = nx.compose(G,H) 
F.edges() 
> [(1, 2), (1, 3)] 

還有其他選項做symmetric difference, intersection ...

如果你有多個圖形聯合起來,就可以使用compose_all,這只是一個包裝周圍compose循環。

+0

當我們使用'nx.draw_networkx(G)nx.draw_networkx(H)nx.draw_networkx(F)繪製全部圖像時,如何強制所有圖形共享相同位置)plt.show()'?我的意思是,對於所有3個圖,節點'1'的座標應該是相同的。 – Sigur

+0

@Sigur繪圖命令採用(可選)輸入'pos',如'nx.draw_networkx(G,pos = pos)'。 'pos'是一個字典,其鍵是節點,其值是它們的(x,y)座標。你可以自己定義它,或者通過一些'layout'命令來定義它。例如'pos = nx.spring_layout(F)'。 – Joel

+0

我想先使用佈局來獲得良好的顯示效果,然後在添加新邊和在其他窗口中再次繪製時使用相同的座標。或多或少,我想製作一系列圖形來顯示圖形的一種時間線。 – Sigur

4

這樣做了。

U=nx.Graph() 
    U.add_edges_from(G.edges()+H.edges()) 
    U.add_nodes_from(G.nodes()+H.nodes()) #deals with isolated nodes 

,或者保留邊緣屬性:

U.add_edges_from(G.edges(data=True)+H.edges(data=True)) 

,並且還保留節點屬性:

U.add_nodes_from(G.nodes(data=True)+H.nodes(data=True))