仅绘制 Djikstra 的节点和边 Networkx

Drawing only Djikstra's Nodes and Edges Networkx

我在 Python 中使用 Networkx 计算 Djisktra 的最短路径时遇到问题。我试图只绘制 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 中的节点和路径中的边。实际上,您可以使用指定要绘制哪些节点的 nodelist 参数来完全避免 noCor

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

要仅绘制对应于 A 的边,您需要弄清楚它们是什么。我知道的最简单的方法是

h = g.subgraph(A)

那么h就是在节点A上导出的子图。它具有 A 中的所有边。我 99.9% 确定(但还没有通过正式证明检查)如果 A 是两个节点之间的最短路径(由 Dijkstra 返回),那么 [= 中的节点之间没有任何其他边16=] 除了路径中的那些。所以 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)。这告诉它用 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()]