簡體   English   中英

NetworkX 中的二分圖

[英]Bipartite graph in NetworkX

B.add_nodes_from(a, bipartite=1)
B.add_nodes_from(b, bipartite=0)
nx.draw(B, with_labels = True)  
plt.savefig("graph.png")

我得到下圖。 我怎樣才能讓它看起來像一個合適的二分圖?

我的圖表

你可以做這樣的事情,在特定的x坐標處從每個分區繪制節點:

X, Y = bipartite.sets(B)
pos = dict()
pos.update( (n, (1, i)) for i, n in enumerate(X) ) # put nodes from X at x=1
pos.update( (n, (2, i)) for i, n in enumerate(Y) ) # put nodes from Y at x=2
nx.draw(B, pos=pos)
plt.show()

二分圖

關鍵是為nx.draw pos參數創建dict ,即:

以節點為鍵,以位置為值的字典。

請參閱文檔

NetworkX 已經有一個功能可以做到這一點。

它叫做networkx.drawing.layout.bipartite_layout

您可以使用它生成字典,該字典通過pos參數提供給nx.draw等繪圖函數,如下nx.draw

nx.draw_networkx(
    B,
    pos = nx.drawing.layout.bipartite_layout(B, B_first_partition_nodes), 
    width = edge_widths*5) # Or whatever other display options you like

其中B是完整的二部圖(表示為常規 networkx 圖),而B_first_partition_nodes是您希望放置在第一個分區中的節點。

這將生成一個數字位置字典,該字典傳遞給繪圖函數的pos參數。 您也可以指定布局選項,請參閱主頁

強制性示例輸出: 在此處輸入圖片說明

另一個例子,結合圖和二部圖:

G = nx.read_edgelist('file.txt', delimiter="\t")
aux = G.edges(data=True)
B = nx.Graph()
B.add_nodes_from(list(employees), bipartite=0)
B.add_nodes_from(list(movies), bipartite=1)
B.add_edges_from(aux)

%matplotlib notebook
import [matplotlib][1].pyplot as plt
plt.figure()

edges = B.edges()
print(edges)
X, Y = bipartite.sets(B)
pos = dict()
pos.update( (n, (1, i)) for i, n in enumerate(X) ) # put nodes from X at x=1
pos.update( (n, (2, i)) for i, n in enumerate(Y) ) # put nodes from Y at x=2
nx.draw_networkx(B, pos=pos, edges=edges)
plt.show()

mdml's answer 的啟發,另一種以“經典”方式獲得 plot 完整二分圖的方法:

import networkx as nx
import matplotlib.pyplot as plt

m, n = 5, 10
K = nx.complete_bipartite_graph(m, n)
pos = {}
pos.update((i, (i - m/2, 1)) for i in range(m))
pos.update((i, (i - m - n/2, 0)) for i in range(m, m + n))

fig, ax = plt.subplots()
fig.set_size_inches(15, 4)
nx.draw(K, with_labels=True, pos=pos, node_size=300, width=0.4)
plt.show()

完全二分圖 K_{5,10}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM