仅绘制Djikstra的Nodes和Edges Networkx

时间:2015-05-20 16:55:48

标签: python python-3.4 networkx

使用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)

但它会保存所有图表。请有人帮帮我吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

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()]