使用Networkx计算Djisktra的Python最短路径时遇到了问题。我试图只绘制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)
但它会保存所有图表。请有人帮帮我吗?
非常感谢!
答案 0 :(得分:2)
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)
您可能会问为什么我对pos
而不是g
定义了h
。这可能是因为您可能希望稍后将g
中的其他节点绘制到您的图中或其他图中,然后将其保持一致的位置非常有用。如果你只是针对h
这样做,它基本上想要创建一条直线。
对您的命令nx.draw_networkx_nodes(g, pos=pos, node_color=noCor)
发表了一些评论。这告诉它使用g
中的颜色绘制noCor
中的所有节点[并且它将根据颜色在noCor
中出现的顺序以及节点出现的顺序为节点着色g.nodes()
]。最后,请注意您需要使用matplotlib将识别的颜色(请参阅http://matplotlib.org/api/colors_api.html)。在这种情况下:
noCor = ["b" if n in A else "r" for n in g.nodes()]