我在使用 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)
但它会保存所有图形。有人可以帮帮我吗?
非常感谢!
最佳答案
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()]
关于python - 仅绘制 Djikstra 的节点和边 Networkx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30355932/