Python 仅图纸Djikstra';s节点和边网络X
我在Python中使用Networkx计算Djisktra的最短路径时遇到问题。我试图只绘制Djikstra方法返回的最短路径,因为要绘制的节点和边太多了Python 仅图纸Djikstra';s节点和边网络X,python,python-3.4,networkx,Python,Python 3.4,Networkx,我在Python中使用Networkx计算Djisktra的最短路径时遇到问题。我试图只绘制Djikstra方法返回的最短路径,因为要绘制的节点和边太多了 nx.draw_networkx_nodes(g,pos=pos, nodelist = A, node_color = 'b') 我已经: A = nx.dijkstra_path(g,'source','target') 它工作得很好。在此之后,我: noCor = ["blue" if n in A else "red" for n
nx.draw_networkx_nodes(g,pos=pos, nodelist = A, node_color = 'b')
我已经:
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返回),则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
,而不是h
。这是因为你可能想稍后在你的图形或其他图形中绘制g
中的一些其他节点,然后保持一致的位置是很有用的。如果只针对h
,它基本上会创建一条直线
关于命令的一些注释
nx.draw\u networkx\u节点(g,pos=pos,node\u color=noCor)
。这告诉它使用noCor
[中的颜色绘制g
中的所有节点,并根据颜色在noCor
中的显示顺序以及节点在g.nodes()中的显示顺序为节点着色。最后,请注意,您需要使用matplotlib可以识别的颜色(请参阅)。在这种情况下:
noCor = ["b" if n in A else "r" for n in g.nodes()]
对不起,它是否只绘制A中的节点和边(在本例中为最短路径)?!因为使用我的代码,我得到了所有节点(蓝色表示最短路径,红色表示同一图像中的其他节点),但我只想在图像中绘制蓝色节点。谢谢:)好的-您的代码看起来像是在尝试使用不同的颜色绘制节点。我已经修改过了。