Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅图纸Djikstra';s节点和边网络X_Python_Python 3.4_Networkx - Fatal编程技术网

Python 仅图纸Djikstra';s节点和边网络X

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

我在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 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中的节点和边(在本例中为最短路径)?!因为使用我的代码,我得到了所有节点(蓝色表示最短路径,红色表示同一图像中的其他节点),但我只想在图像中绘制蓝色节点。谢谢:)好的-您的代码看起来像是在尝试使用不同的颜色绘制节点。我已经修改过了。