NetworkX中的二分图

时间:2014-11-23 00:03:58

标签: matplotlib networkx bipartite

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

我得到了下图。我怎样才能使它看起来像一个合适的二分图?

My graph

3 个答案:

答案 0 :(得分:17)

您可以执行以下操作,从特定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()

bipartite-graph

关键是为dict nx.draw参数创建pos,其中包括:

  
    

以节点为键,位置为值的字典。

  

请参阅the docs

答案 1 :(得分:3)

NetworkX已经具有执行此操作的功能。

它叫networkx.drawing.layout.bipartite_layout

您可以使用它来生成字典,该字典通过nx.draw自变量输入到pos之类的绘图函数,如下所示:

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参数。您也可以指定布局选项,请参见main page

强制性示例输出: enter image description here

答案 2 :(得分:1)

另一个示例,将图形与二部图组合:

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()