2015-09-18 15 views
12

Nói rằng tôi có hai đồ thị networkx, GH:Kết hợp (tham gia) Đồ thị 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) 

cách tốt nhất để tham gia hai đồ thị networkx là gì?

Tôi muốn giữ nguyên tên nút (lưu ý các nút chung, từ 2 đến 7). Khi tôi sử dụng nx.disjoint_union(G,H), điều này đã không xảy ra:

>>> 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] 
# 

Các H nhãn nút đã được thay đổi (không phải những gì tôi muốn). Tôi muốn tham gia các đồ thị tại các nút có cùng số.

Lưu ý. Đây không phải là bản sao của Combine two weighted graphs in NetworkX.

+1

Bạn muốn làm gì nếu một cạnh tồn tại trong cả hai? Nó có nên trở thành một cạnh kép? hoặc chỉ là một cạnh duy nhất? – Joel

+0

@ Joel hmm Tôi quan tâm đến cả hai trường hợp. Hãy nói cạnh duy nhất mặc dù. – atomh33ls

+1

Trường hợp cạnh duy nhất được xử lý bằng mã bạn đã viết. Trường hợp đa hợp bạn chỉ cần làm 'U = nx.MultiGraph()' – Joel

Trả lời

23

Chức năng bạn đang muốn tìm 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)] 

Ngoài ra còn có tùy chọn khác để làm symmetric difference, intersection ...

Nếu bạn có nhiều đồ thị để tham gia với nhau, bạn có thể sử dụng compose_all, mà chỉ kết thúc tốt đẹp cho một vòng quanh compose.

+0

Cách buộc tất cả các đồ thị chia sẻ cùng một vị trí cho các nút có cùng nhãn khi chúng ta vẽ tất cả với' nx.draw_networkx (G) nx.draw_networkx (H) nx.draw_networkx (F) plt.show() '? Ý tôi là, tọa độ của nút '1' phải giống nhau đối với tất cả 3 biểu đồ. – Sigur

+0

@Sigur Lệnh vẽ âm mưu lấy một đầu vào (tùy chọn) 'pos' như' nx.draw_networkx (G, pos = pos) '. 'pos' là một từ điển có khóa là các nút và giá trị của chúng là tọa độ (x, y) của chúng. Bạn có thể tự định nghĩa nó hoặc thông qua một số lệnh 'layout'. ví dụ: 'pos = nx.spring_layout (F)'. – Joel

+0

Tôi muốn sử dụng bố trí đầu tiên để có được một màn hình tốt và sau đó sử dụng các coords tương tự khi tôi thêm các cạnh mới và vẽ lại trong cửa sổ khác. Nhiều hơn hoặc ít hơn tôi muốn tạo ra một chuỗi các số liệu để hiển thị một loại dòng thời gian cho biểu đồ. – Sigur

4

Điều này đã thực hiện.

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

hoặc, giữ gìn cạnh thuộc tính:

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

và, cũng duy trì các thuộc tính nút:

U.add_nodes_from(G.nodes(data=True)+H.nodes(data=True)) 
Các vấn đề liên quan