【问题标题】:Why does nx.draw_networkx_edges not connect the nodes when plotting graph edges?为什么 nx.draw_networkx_edges 在绘制图形边缘时不连接节点?
【发布时间】:2020-10-16 08:12:08
【问题描述】:

我有一个图表G 想要绘制。 G 是一个空间有向图,因此我的节点具有我想要绘制它们的特定坐标。该图是使用来自heresknw.build_sknw 从图像的形态骨架构建的(但我认为它没有发挥重要作用)。 但是,在绘图时,我遇到了一些边连接问题,其中两个相邻节点之间的某些边在图中没有连接。它们指向正确的方向,但太短了。但是,这只发生在某些边缘上。大多数都正确显示:

这是一个重现错误的最小示例,其中包含 3 个节点和 2 个边:

我正在通过以下方式从边缘列表中读取图表:

G = nx.read_edgelist('test.edgelist', data=True, create_using=nx.DiGraph())

test.edgelist 如下所示:

2789 2762 {'pts': [[697, 259], [698, 259], [699, 259], [700, 259], [701, 259], [702, 259], [703, 259], [704, 259], [705, 259]], 'weight': 8.0}
2789 2823 {'pts': [[708, 264], [707, 265], [706, 266], [706, 267], [706, 268], [706, 269], [705, 270], [704, 271], [703, 272], [702, 273], [701, 274], [700, 275], [699, 275], [698, 275], [697, 275], [696, 275], [695, 276], [695, 277], [695, 278], [695, 279], [695, 280], [695, 281], [695, 282], [696, 283], [697, 284], [697, 285], [697, 286], [697, 287], [698, 288], [698, 289], [699, 290], [699, 291], [699, 292], [699, 293], [700, 294], [700, 295], [701, 296], [701, 297], [701, 298], [702, 299], [702, 300], [703, 301], [704, 302], [705, 303], [706, 304], [707, 305], [707, 306], [708, 307], [708, 308], [709, 309], [710, 309], [711, 310], [712, 310], [713, 310]], 'weight': 62.94112549695427}

“pts”列表对应于原始形态骨架的像素(在第一张图像中为白色),它们位于两个交叉点(即我的图表中的节点)之间。

我使用nx.draw_networkx_edgesnx.draw_networkx_nodes 来绘制我的图表。我使用坐标字典 coord_dict 定义布局,如下所示:

coord_dict = {'2789': [707, 261], '2823': [714, 311], '2762': [695, 259]}

现在,每当我使用以下代码绘制图表时:

edges = nx.draw_networkx_edges(G, pos=coord_dict, arrows=True, arrowstyle='->', edge_color='green', arrowsize=0.75, width=0.45, ax=ax)
nodes = nx.draw_networkx_nodes(G, pos=coord_dict, node_size=0.15, node_color='red')

我得到一个像这样的图,其中边没有连接到第二个节点:

我发现,当不通过arrows=False 绘制边缘时,直边将连接。然而,箭头对我的可视化很重要,因此我希望能帮助我克服这个绘图问题。另外,我想了解为什么有些箭头可以正确连接而其他箭头不能正确连接的一般问题。谢谢!

【问题讨论】:

    标签: python plot networkx


    【解决方案1】:

    发生这种情况是因为边和节点是独立生成的,手动设置大小和宽度可能会导致节点与边稍微分开。如果您不需要单独绘制它们,只需调用nx.draw

    nx.draw(G, pos=coord_dict, 
            arrowstyle='->', 
            arrowsize=20, 
            width=2,
            with_labels=True, 
            node_size=500, 
            node_color='orange',
            edge_color='green')
    

    或者,与您所做的相同,但避免自定义节点和箭头大小:

    plt.figure(figsize=(8,5))
    ax = plt.gca()
    nx.draw_networkx_edges(G, pos=coord_dict, arrows=True, arrowstyle='->', 
                           edge_color='green', width=2, ax=ax)
    nx.draw_networkx_nodes(G, pos=coord_dict, node_color='orange')
    nx.draw_networkx_labels(G, pos=coord_dict)
    plt.box(False)
    

    【讨论】:

    • 啊,是的,这解决了我的具体问题,谢谢!但是,它并没有真正解释为什么它只是一些节点/边缘的问题,而不是全部。此外,从箭头到它应该连接的节点中心的距离在一个图表中变化很大。你知道为什么这个问题只在某些情况下存在吗?
    • 是的,这很奇怪。大小应该在所有图表中成比例,所以我真的不知道。我的猜测是它仍然与手动设置尺寸有关。可能存在比例因子,并且通过设置小于1 的大小,结果可能会因对象而异。但只是猜测。我会采用其中一种方法@sara
    猜你喜欢
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 2020-04-29
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多