仅绘制Dijkstra节点和边的Networkx网络

3

我在使用Python中的Networkx计算Dijkstra最短路径时遇到了问题。我想仅绘制Djikstra方法返回的最短路径,因为要绘制的节点和边很多。

我已经有了:

A = nx.dijkstra_path(g,'source','target')

它运行良好。之后我有:

noCor = ["blue" if n in A else "red" for n in g.nodes()]
pos = nx.spring_layout(g)
nx.draw_networkx_nodes(g, pos=pos, node_color=noCor)
nx.draw_networkx_edges(g, pos=pos)
fig = plt.axis('off')
fig = plt.gcf()
fig.set_size_inches(52.08,52.08)
fig.savefig("Djikstra.png",dpi=96)

但它会保存所有的图表。能有人帮我吗?非常感谢!
1个回答

3
TL/DR:只需执行以下操作:
pos = nx.spring_layout(g)
h = g.subgraph(A)
nx.draw_networkx_nodes(h,pos=pos, node_color='b') #or even nx.draw(h,pos=pos,node_color='b') to get nodes and edges in one command
nx.draw_networkx_edges(h,pos=pos)

完整答案:

您只想绘制A中的节点和路径中的边缘。实际上,您可以完全避免使用noCor,使用指定要绘制哪些节点的nodelist参数即可。

nx.draw_networkx_nodes(g,pos=pos, nodelist = A, node_color = 'b')

要仅绘制与A对应的边缘,您需要找出这些边缘是什么。我所知道的最简单的方法是:
h = g.subgraph(A)

那么h是在节点A上诱导的子图。它包含A中所有的边。我有99.9%的把握(但没有通过正式证明进行验证),如果A是两个节点之间的最短路径(如Dijkstra返回的),则除了路径中的边之外,A中的节点之间就没有其他边。因此,h.edges()将给出A的边。

nx.draw_networkx_edges(g,pos=pos, edgelist = h.edges())

更紧凑的形式可以这样写:
pos = nx.spring_layout(g)
h = g.subgraph(A)
nx.draw_networkx_nodes(h,pos=pos, node_color='b') #or even nx.draw(h,pos=pos,node_color='b') to get nodes and edges in one command
nx.draw_networkx_edges(h,pos=pos)

您可能会问为什么我是以 g 为基础定义了 pos,而不是以 h 为基础。这是因为您可能希望稍后在您的图中或其他图中绘制一些其他节点,并且具有一致的位置是有用的。如果您只是以 h 为基础进行操作,它基本上会创建一条直线。
关于您的命令 nx.draw_networkx_nodes(g, pos=pos, node_color=noCor) 的一些注释。这告诉它使用来自 noCor 的颜色绘制 g 中的所有节点 [它将根据颜色在 noCor 中出现的顺序以及节点在 g.nodes() 中出现的顺序对节点进行着色]。最后,请注意您需要使用 matplotlib 可识别的颜色(请参见 http://matplotlib.org/api/colors_api.html)。在这种情况下:
noCor = ["b" if n in A else "r" for n in g.nodes()]

抱歉,它只会绘制A中的节点和边(在这种情况下是最短路径)吗?!因为使用我的代码,我得到了所有节点(蓝色表示最短路径,红色表示同一图像中的其他节点),但我只想在图像中绘制蓝色的节点。谢谢 :) - MattGA
好的 - 你的代码看起来像是想用不同的颜色绘制节点。我已经进行了修改。 - Joel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接