如何在DiGraph中的两个节点之间制作弯曲的边缘?

时间:2019-08-06 14:01:57

标签: python-3.x matplotlib networkx

我正在尝试使用NetworkX库在DiGraph中的两个节点之间添加弯曲的箭头。

nx.draw_networkx_edges的文档中提到属性connectionstyle = 'arc3, rad = 0.2'应该产生弯曲的连接器。但我无法重现。 我还研究了模块matplotlib.patches并按https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.patches.ConnectionStyle.html#matplotlib.patches.ConnectionStyle中所述调用ConnectionStyle;但我仍然得到相同的视觉效果。

array_of_edges = list(zip(df.start_node,df.end_node,df.weight))
G.add_weighted_edges_from(array_of_edges)
nx.draw_networkx_edges(G,pos_nodes,
                       edge_color = '#5B174C',
                       width = df['weight']/600,
                       alpha = 0.8,
                       connectionstyle= 'arc3,rad=0.2'
                       )

这就是我得到的,这是我所需要的: https://imgur.com/a/1TcPfY9

1 个答案:

答案 0 :(得分:3)

前一段时间我有一个类似的问题(我想比较同一个网络的两个状态)。我无法使用networkx来制定解决方案,因此我自己制作了代码,可以在here中找到其代码。

enter image description here

您将必须将边缘列表转换成正方形邻接矩阵,其中不存在连接用NaN表示,而非NaN条目将被解释为边缘权重并映射到边缘颜色。然后,您可以使用

调用该模块
network_line_graph.draw(adjacency_matrix, node_order=None, arc_above=True) 

请注意,如果您未明确指定节点顺序,则使用递归最小流切割来优化节点顺序,以将强连接的子网/节点放置在一起(理想情况下,您将使总弧长最小化,但这会很快增加计算量)

API与networkx非常相似,但是如果确实有任何问题,请在github上提出问题。