无法使用networkx显示正确的二分图

时间:2017-05-18 17:13:15

标签: networkx bipartite

我正在尝试绘制一个二分图,左边的节点颜色与右边的节点不同。我正在使用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]不会保留在左侧,如何保持左侧,以及蓝色? My output graph

1 个答案:

答案 0 :(得分:0)

<强>更新 再次查看您的代码,我发现只有颜色取决于您所谓的leftright。这些职位是根据您拨打的lr来确定的。您在处理leftright以及如何处理lr方面存在错误,因此我将分别处理这些问题。

因此,让我们首先看一下颜色:当您定义leftright时,概念上会出现错误。

您将节点3放在左侧和右侧。您的边缘(1,3)在左侧放置3,而(3,4)放置在右侧。因此,节点3最终的颜色为'blue',因为您已将其放在right中。由于4未放入right,因此最终'aqua'。请注意,令人困惑的是,元组左侧的内容最终会出现在right中,并且您告诉它用蓝色right颜色,同时在您对错误的解释中说你希望你的情节的是蓝色的。你应该把这一切都保持一致,因为它将来很难避免犯更多的错误。

现在让我们看一下节点位置:为什么[1,2,3]不会在左边结束。您已经定义了lr而不是之前定义的leftright(我不认为这是一个好主意 - 使用只是一个定义,否则你只是让它更难以找到错误)。您已使用l,r = nx.bipartite.sets(B)此处存在一些问题。首先,节点2和5可以在任一侧结束。它是一个任意选择,由不可预测的顺序决定,其中python循环通过字典中的键。所以你很幸运2l结束了。同样,节点1可能很容易在r中结束。

期望3最终与1在同一侧是没有希望的 - networkx算法bipartite.sets根据节点是否共享边缘来分隔节点。由于边缘(1,3)位于图表中,因此它们不会位于同一侧。如果您使用了之前定义的leftright,那么1就会出现在右侧,而3最终会出现在左侧或右侧,取决于两个pos.update命令的顺序,因为它同时包含leftright