2015-05-20 88 views
1

我使用Networkx在Python中計算Djisktra的最短路徑時遇到了問題。我試圖只畫出由Djikstra方法返回的最短路徑,因爲有太多的節點和邊要繪製。僅繪製Djikstra的節點和邊緣Networkx

我已經有了:

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) 

但它會保存所有圖形。有人能幫助我嗎?

非常感謝!

回答

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和節點路徑的邊緣。實際上可以使用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) 

你可能會問,爲什麼我對於定義posg而非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()] 
+0

對不起,但它只能畫出A中的節點和邊(在這種情況下是最短路徑)?!因爲使用我的代碼,我得到所有節點(藍色爲最短路徑,紅色爲同一圖像中的其他節點),但我只想繪製圖像中的藍色節點。謝謝:) – MattGA

+0

好吧 - 你的代碼看起來像你試圖用不同的顏色繪製節點。我修改了它。 – Joel

+0

哇,謝謝!它真的工作! – MattGA

相關問題