2017-05-18 50 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