我想使用networkx(如果您知道更好的框架,我也可以考虑其他框架)来创建一个节点位置固定且边不重叠的图。
我的以前的代码看起来像这样:
#!/usr/bin/env python3
import networkx as nx
import matplotlib.pyplot as plt
# Graph data
names = ['A', 'B', 'C', 'D', 'E']
positions = [(0, 0), (0, 1), (1, 0), (0.5, 0.5), (1, 1)]
edges = [('A', 'B'), ('A', 'C'), ('A', 'D'), ('A', 'E'), ('D', 'A')]
# Matplotlib figure
plt.figure('My graph problem')
# Create graph
G = nx.MultiDiGraph(format='png', directed=True)
for index, name in enumerate(names):
G.add_node(name, pos=positions[index])
labels = {}
for edge in edges:
G.add_edge(edge[0], edge[1])
labels[(edge[0], edge[1])] = '{} -> {}'.format(edge[0], edge[1])
layout = dict((n, G.node[n]["pos"]) for n in G.nodes())
nx.draw(G, pos=layout, with_labels=True, node_size=300)
nx.draw_networkx_edge_labels(G, layout, edge_labels=labels)
plt.show()
并给出以下结果
我如何确保边缘是“圆形”的,以便它们不重叠?
cairocffi==0.9.0 cffi==1.11.5 cycler==0.10.0 decorator==4.3.0 kiwisolver==1.0.1 matplotlib==3.0.0 networkx==2.2 numpy==1.15.2 pgi==0.0.11.2 pycparser==2.19 pyparsing==2.2.2 python-dateutil==2.7.3 six==1.11.0
你能分享一下你的吗? - Aiyion.Primenetworkx
无法绘制带有曲线边缘的图形,尽管修改源代码以实现这一点并不太困难。networkx
在draw_networkx_edges
中使用matplotlib的FancyArrowPatch
类来绘制箭头(由draw
包装)。FancyArrowPatch
支持一个connectionstyle
参数,但draw_networkx_edges
没有设置它;默认是一条直线,这就是你目前得到的结果。鉴于您提供的MWE的质量,我猜测您将能够克隆networkx
的github存储库,并修补draw_networkx_edges
。 - Paul Brodersen