B.add_nodes_from(a, bipartite=1)
B.add_nodes_from(b, bipartite=0)
nx.draw(B, with_labels = True)
plt.savefig("graph.png")
我得到了以下图形。如何将其变成一个正确的二分图?
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
参数所需的字典:
一个以节点为键,位置为值的字典。
详情请参阅文档。
NetworkX已经有一个可以做到这一点的函数。
它被称为networkx.drawing.layout.bipartite_layout
您可以使用它生成字典,然后通过pos
参数将其提供给绘图函数,如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的回答启发,还有一种以“经典”的方式绘制完全二分图的方法:
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()
X = {n for n, d in B.nodes(data=True) if d["bipartite"] == 0}
nx.draw_networkx(B, pos=nx.drawing.layout.bipartite_layout(B, X))