我有一个要绘制的图形G
。G
是一个空间有向图,因此我的节点具有我想要绘制的特定坐标。该图是使用here的sknw.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_edges
和nx.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
绘制边时,直线边将连接在一起。然而,箭头对我的可视化很重要,因此我将非常感谢任何人帮助我克服这个绘图问题。另外,我想了解一下为什么一些箭头可以正确连接,而另一些则不能。谢谢!
发布于 2020-10-16 08:38:35
这是因为边和节点是独立生成的,手动设置大小和宽度可能会导致节点与边稍微分离。如果您不需要单独绘制它们,只需通过一个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)
https://stackoverflow.com/questions/64385340
复制