簡體   English   中英

如何在“點”圖形布局中選擇根節點以使用 networkx 和 pydot/pygraphviz 進行繪圖

[英]How to choose root node in "dot" graph layout for plotting with networkx and pydot/pygraphviz

我正在嘗試使用 networkx 為樹形圖創建可視化。
如何選擇根節點? 即從頂部的第一個。
運行此代碼:

import networkx as nx
import pydot
import matplotlib.pyplot as plt
from networkx.drawing.nx_pydot import *

G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(2,4)
G.add_edge(4,5)
G.add_edge(4,6)
G.add_edge(5,7)

pos = pydot_layout(G, prog="dot", root=4)
nx.draw(G, pos, with_labels=True)
plt.show()

給出這個輸出:

輸出

請注意,我使用root=4創建布局,但圖片中的根仍然是節點 1。
如何決定哪個節點被選為第一個/最重要的節點?
使用其他prog選項,例如“twopi”,它確實對我設置為 root 的內容做出反應。

注意: Networkx 可視化總是向節點隨機返回一個繪圖。

僅僅因為node 1出現在圖表頂部並不意味着它是根節點! 由於您可能正在使用 PyCharm(或任何編輯器),因此每次運行腳本時都會出現這種情況,它會存儲一些緩存,以便您可以獲得相同的輸出,但我向您保證,節點可視化是隨時創建的。

由於您想區分根節點和其他節點,我建議您使用nx.draw() node_color參數。

為每個節點創建一個顏色列表並將其傳遞給node_color

這是您可以使用的完整修改代碼:-

G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(2,4)
G.add_edge(4,5)
G.add_edge(4,6)
G.add_edge(5,7)    

pos = pydot_layout(G, prog="dot", root=4)

colors = []
for node in G:
    if node == 4:
        colors.append('red')
    else: 
        colors.append('blue')
  
pos = pydot_layout(G, prog="dot", root=4)
nx.draw(G, pos,node_color=colos,with_labels=True)
plt.show()

不幸的是,由於 networkx 可視化與高度密集的可視化庫(如 seaborn 和 matplotlib)集成,因此無法確定每個節點的方向。

如果 G 是一棵樹,我找到了一個解決方案。 創建一個輔助(有向/ nx.DiGraph )圖,其中每條邊 (v,w) 的方向由 v 和 w 在 BFS 中從根開始探索的順序確定。
然后從有向圖 aux_G 中取出布局pos並用它繪制 G

aux_G = my_func_directed_bfs(G, root=4)

pos = pydot_layout(aux_G , prog="dot")
nx.draw(G, pos, with_labels=True)
plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM