【问题标题】:How can I make curved edges between two nodes in a DiGraph?如何在有向图中的两个节点之间制作弯曲边缘?
【发布时间】:2019-08-06 14:01:57
【问题描述】:

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

函数nx.draw_networkx_edges 的文档提到了参数connectionstyle。设置connectionstyle='arc3, rad = 0.2' 应该产生弯曲的连接器。但我无法重现这一点。 我还查看了模块matplotlib.patches 并调用ConnectionStyle,如https://matplotlib.org/stable/api/_as_gen/matplotlib.patches.ConnectionStyle.html 中所述;但我仍然得到相同的视觉效果。

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

【问题讨论】:

    标签: python-3.x matplotlib networkx


    【解决方案1】:

    不久前我遇到了类似的问题(我想比较同一网络的两个状态)。我无法使用networkx 找到解决方案,所以我自己做了一个,可以在here 找到它的代码。

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

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

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

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

    【讨论】:

    • 谢谢!尽管我试图在 Python 3 上运行您的示例,但它给出了一个错误:TypeError: len() of unsized object。一旦针对我的问题运行,我将接受答案:) github.com/paulbrodersen/network_line_graph#example
    • 你能在 github 上提出一个问题,用一个完整的 MWE 重现问题,以及相关的错误跟踪吗?我计算的不仅仅是一个对象的长度,因此不清楚哪一行会引发错误。
    • 嘿,我想通了,并打开了一个拉取请求;因为我对 GitHub 有点陌生,如果我做错了什么,我深表歉意。 github.com/avantika-banerjee/network_line_graph/pull/1
    • 不,你没有做错任何事。有几个 Python 3 兼容性问题,您遇到了其中一个问题。我修复了一些,只是推送了一个更新版本。我现在将审查您的 PR,但您解决的问题可能已经在新版本中得到解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多