我正在尝试绘制一个二分图,左边的节点颜色与右边的节点不同。我正在使用networkx和matplotlib这样做。 鉴于二分图[(1,3),(2,5),(3,4)],我希望显示[1,2,3],一边是蓝色,另一边是[4,5]有色的浅绿色另一边,边缘(1,3),(2,5),(3,4)介于两者之间。 以下是我的代码。
import networkx as nx
import matplotlib.pyplot as plt
def draw_bipartite(edges_list):
left,right = set(),set()
for s,t in edges_list:
right.add(s)
left.add(t)
B = nx.Graph()
B.add_nodes_from(list(right), bipartite=0)
B.add_nodes_from(list(left), bipartite=1)
B.add_edges_from(edges_list)
nodecolor = []
for node in B.nodes():
a = 'blue' if node in list(right) else 'aqua'
nodecolor.append(a)
l,r = nx.bipartite.sets(B)
pos = {}
pos.update((node, (1, index)) for index, node in enumerate(l))
pos.update((node, (2, index)) for index, node in enumerate(r))
nx.draw(B, pos=pos,with_labels = True,node_color=nodecolor)
plt.show()
draw_bipartite([(1, 3), (2, 5), (3, 4)])
在输出中,组[1,2,3]不会保留在左侧,如何保持左侧,以及蓝色?
答案 0 :(得分:0)
<强>更新强>
再次查看您的代码,我发现只有颜色取决于您所谓的left
和right
。这些职位是根据您拨打的l
和r
来确定的。您在处理left
和right
以及如何处理l
和r
方面存在错误,因此我将分别处理这些问题。
因此,让我们首先看一下颜色:当您定义left
和right
时,概念上会出现错误。
您将节点3放在左侧和右侧。您的边缘(1,3)
在左侧放置3,而(3,4)
放置在右侧。因此,节点3最终的颜色为'blue'
,因为您已将其放在right
中。由于4未放入right
,因此最终'aqua'
。请注意,令人困惑的是,元组左侧的内容最终会出现在right
中,并且您告诉它用蓝色right
颜色,同时在您对错误的解释中说你希望你的情节的左是蓝色的。你应该把这一切都保持一致,因为它将来很难避免犯更多的错误。
现在让我们看一下节点位置:为什么[1,2,3]
不会在左边结束。您已经定义了l
和r
而不是之前定义的left
和right
(我不认为这是一个好主意 - 使用只是一个定义,否则你只是让它更难以找到错误)。您已使用l,r = nx.bipartite.sets(B)
此处存在一些问题。首先,节点2和5可以在任一侧结束。它是一个任意选择,由不可预测的顺序决定,其中python循环通过字典中的键。所以你很幸运2
在l
结束了。同样,节点1
可能很容易在r
中结束。
期望3
最终与1
在同一侧是没有希望的 - networkx算法bipartite.sets
根据节点是否共享边缘来分隔节点。由于边缘(1,3)
位于图表中,因此它们不会位于同一侧。如果您使用了之前定义的left
和right
,那么1
就会出现在右侧,而3
最终会出现在左侧或右侧,取决于两个pos.update
命令的顺序,因为它同时包含left
和right
。