[英]How to efficiently create interactive directed network graphs (with arrows) on Python?
[英]How to draw readable, preferably interactive, network graphs with python?
我正在嘗試繪制運行我的腳本的任何網絡的圖形。 我使用 scapy 來收集數據包,並希望每台計算機都有一個節點進行通信,每個連接都有一個邊緣。
問題是我找不到一種方法可以在我的屏幕上很好地可視化圖表。 到目前為止,將 networkx 與 matlib.pyplot 相結合設法帶來了最好的結果,但它仍然看起來非常隨機和混亂,標簽難以閱讀,節點相互重疊,等等。 還最好具有與圖形交互的能力 - 移動節點,將鼠標懸停在節點/邊緣上以獲取額外信息,可能放大甚至將節點聚集在一起,以便當您單擊集群時,您可以看到哪些節點組成集群。
由於分析網絡數據並向圖形添加節點和邊對於您來說閱讀起來會很乏味,因此我在此處僅添加相關部分(實際顯示我構建的圖形的部分):
pos = nx.spring_layout(Graph, scale=2)
edge_labels = nx.get_edge_attributes(Graph, "Protocol")
nx.draw(Graph,pos, with_labels=True, node_size=600, font_size=8, font_weight='bold')
nx.draw_networkx_edge_labels(Graph, pos, edge_labels=edge_labels, font_size=8)
plt.show()
(我將網絡導入為 nx,將 matplotlib.pyplot 導入為 plt)
我也嘗試過 graphviz、ploty 和 bokeh,但無法真正讓它們工作,在 Google 上進行故障排除后,我覺得無論如何它們都不會解決我的問題,我也嘗試了 adjustText - 但我無法將它放入我的以任何方式編寫代碼(無法找到如何獲取我的圖形的文本屬性)和 Holoviews - 但無論我嘗試什么,它都拒絕顯示圖像(即使我從他們的網站復制和粘貼示例 - 要么是 python 說的'%opts...' 是無效語法,或者如果我嘗試以任何其他方式更改選項,代碼只會運行直到它結束並且屏幕上不顯示任何內容。
我在網上找到了很多部分解決方案,所以它們都不起作用,有人有全面的解決方案嗎?
用plt
畫重圖可能有點問題,這里的問題不僅是數據的問題,也是人眼一看就知道很多信息的問題。 我的建議是使用更高級的圖形可視化庫,例如ipycytoscape
。 您還可以定義符合您需求的樣式和更多功能
from ipycytoscape import CytoscapeWidget
graph_draw = ipycytoscape.CytoscapeWidget()
graph_draw.graph.add_graph_from_networkx(nx_graph, directed=True)
此外,如果您將使用CytoscapeWidget
您可以與圖形交互並將視圖的焦點與圖形中您最感興趣的部分相匹配。
您可以調整nx.spring_layout
的超參數(k 和迭代)來排列節點。 調整參數后,連接的節點將彼此靠近,未接觸的節點將保持最大可能的距離。
pos = nx.spring_layout(G,k=0.1, iterations=20)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.