簡體   English   中英

python.networkx 有向圖中的單獨邊箭頭

[英]Separate edge arrows in python/networkx directed graph

我想獲得類似這樣的東西:

在此處輸入圖像描述

使用 python 庫networkx 我可以使用以下代碼生成類似的有向圖:

import matplotlib.pyplot as plt
import networkx as nx

G = nx.DiGraph()

G.add_edge('1','2')
G.add_edge('1','3')
G.add_edge('3','2')
G.add_edge('3','4')
G.add_edge('4','3')

nx.draw(G, node_color='w', edgecolors='k', width=2.0, with_labels=True)
plt.show()

產生:

在此處輸入圖像描述

但是,節點 3 和 4 之間的箭頭是疊加的,看起來只是一個有兩個頭的箭頭。 是否可以將它們稍微分開,以便更清楚地表明那里有兩條邊,而不僅僅是一條邊? (我知道可以使用 pygraphviz 來完成,但我正在嘗試使用 matplotlib 來完成)。

您需要一個MultiDiGraph用於兩個節點之間的多條邊:

G = nx.MultiDiGraph()

G.add_edge('1','2')
G.add_edge('1','3')
G.add_edge('3','2')
G.add_edge('3','4')
G.add_edge('4','3')

要可視化網絡,您可以使用顯示平行邊的 Graphviz。 您可以在dot中編寫圖形並使用graphviz.Source顯示圖形:

from networkx.drawing import nx_pydot
from graphviz import Source

nx_pydot.write_dot(G, 'multig.dot')
Source.from_file('multig.dot')

在此處輸入圖像描述

我前段時間 fork 了 .networkx 繪圖實用程序來解決這個問題和我遇到的其他幾個問題。 package 稱為netgraph ,支持繪制networkxigraph圖結構(以及簡單的邊列表)。 它在引擎蓋下使用 matplotlib,並公開創建的藝術家,以便即使沒有內置功能也可以輕松地進一步操作它們。

#!/usr/bin/env python

"""
https://stackoverflow.com/questions/61412323/separate-edge-arrows-in-python-networkx-directed-graph
"""

import matplotlib.pyplot as plt
import networkx as nx
import netgraph

G = nx.DiGraph()

G.add_edge('1','2')
G.add_edge('1','3')
G.add_edge('3','2')
G.add_edge('3','4')
G.add_edge('4','3')

netgraph.draw(G, node_color='w', edge_color='k', edge_width=2.0, node_labels={str(ii) : str(ii) for ii in range(1,5)})
plt.show()

在此處輸入圖像描述

暫無
暫無

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

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