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')
我前段时间分叉了 networkx 绘图实用程序来解决这个问题和我遇到的其他几个问题。该包名为 netgraph,支持绘制 networkx
和 igraph
图结构(以及简单的边列表)。
它在引擎盖下使用 matplotlib,并公开创建的艺术家,以便即使没有内置功能也可以轻松地进一步操作它们。
#!/usr/bin/env python
"""
"""
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()
我想获得类似这样的东西:
使用 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')
我前段时间分叉了 networkx 绘图实用程序来解决这个问题和我遇到的其他几个问题。该包名为 netgraph,支持绘制 networkx
和 igraph
图结构(以及简单的边列表)。
它在引擎盖下使用 matplotlib,并公开创建的艺术家,以便即使没有内置功能也可以轻松地进一步操作它们。
#!/usr/bin/env python
"""
"""
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()