2017-05-18 48 views
0

我想绘制一个二部图,左边的节点与右边的节点不同。我使用networkx和matplotlib来做到这一点。给定一个二部图[(1,3),(2,5),(3,4)],我希望显示[1,2,3],一边是彩色的蓝色,另一边是[4,5]彩色的水色(1,3),(2,5),(3,4)之间。 以下是我的代码。无法显示正确的二分图与网络x

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

+0

请在链接“我的输出图”中找到我的代码的输出 – Dhara

+0

顺便说一下,'list in(right)'中的节点效率非常低。 '右边的节点好得多 – Joel

回答

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(我不认为这是一个好主意 - 只使用一个定义,否则你只是让它更难追捕bug)。您已使用l,r = nx.bipartite.sets(B)这里有几个问题。首先,节点2和5可能在任一侧结束。这是一个任意的选择,它由python在字典中循环键的不可预测顺序决定。所以你很幸运,2最终在l。同样,节点1可能很容易以r结束。

期望3最终将在1的同一侧无望 - networkx算法bipartite.sets根据它们是否共享边来分离节点。由于边缘(1,3)位于图形中,因此它们不会在同一侧结束。如果您曾使用先前定义的leftright,然后1本来就对了,和3就已经结束了在左或右,这取决于你的两个pos.update命令的顺序上,因为它是在这两个leftright