仅绘制 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()]
我在 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()]