[英]Drawing only Djikstra's Nodes and Edges Networkx
我使用Networkx在Python中計算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
的節點和路徑中的邊。 實際上,你可以避開noCor
完全使用nodelist
arguement指定哪個節點繪制。
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)
你可能會問為什么我定義了關於g
而不是h
pos
。 這是因為你可能想要稍后將g
其他節點繪制到你的圖中或其他圖中,然后有一致的位置是有用的。 如果你只是關於h
,它基本上想要創建一條直線。
你的命令nx.draw_networkx_nodes(g, pos=pos, node_color=noCor)
一些評論nx.draw_networkx_nodes(g, pos=pos, node_color=noCor)
。 這告訴它用noCor
的顏色繪制g
所有節點[並且它將根據顏色在noCor
出現的順序以及節點在g.nodes()
出現的順序為節點g.nodes()
。 最后,請注意您需要使用matplotlib將識別的顏色(請參閱http://matplotlib.org/api/colors_api.html )。 在這種情況下:
noCor = ["b" if n in A else "r" for n in g.nodes()]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.