2015-10-14 58 views
1
  • 我有一張很大的圖表,我正在繪製的圖表需要花費很長時間來處理 過程。
  • 是否可以返回圖形當前狀態的statuscurrent_nodepercentage
  • 我不想逐步繪製網絡,因爲我正在做的是將它保存到高DPI圖像。

下面是我使用的代碼示例:繪製大型NetworkX圖形時返回進度狀態

path = nx.shortest_path(G, source=u'1234', target=u'98765') 
path_edges = zip(path, path[1:]) 
pos = nx.spring_layout(G) 
nx.draw_networkx_nodes(G,pos,nodelist=path,node_color='r') 
nx.draw_networkx_edges(G,pos,edgelist=path_edges,edge_color='r',width=10) 
plt.axis('equal') 
plt.savefig('prototype_map.png', dpi=1000) 
plt.show() 

回答

2

我相信這樣做是爲了適應繪製函數的源代碼打印的東西說10%,20%的必由之路完成......但是當我檢查source code of draw_networkx_nodes & draw_networkx時,我意識到這不是一個簡單的任務,因爲繪圖函數將位置(節點和邊)存儲在一個numpy數組中,將它發送到matplotlib的ax.scatter函數(sourcecode)如果不搞亂某些東西,這有點難以操縱。我能想到的唯一的事情就是改變:

xy = numpy.asarray([pos[v] for v in nodelist]) # In draw_networkx_nodes function 

xy = [] 
count = 0 
for v in nodelist: 
    xy.append(pos[v]) 
    count +=1 
    if (count == len(nodelist)): 
     print '50% of nodes completed' 
print '100% of nodes completed' 
xy = numpy.asarray(xy) 

同樣,當draw_network_edges被調用,以表明在邊緣繪製的進展。我不確定這將是多遠,因爲我不知道在ax.scatter函數中花了多少時間。我也查看了分散函數的源代碼,但是我不能指出一個循環或者某個東西來打印已經完成一些進度的指示。

+1

這聽起來足以通過在每個部分的開始處插入日誌語句來報告狀態:如「狀態:存儲%d個節點」%len(節點)。人們甚至可以在相同的地方添加一些時間表,並設置測試用例以通過實驗來了解問題的順序。 – cphlewis

+0

的確,您可以查看matplotlib的分散源代碼以獲取更詳細的狀態。另一個想法是做一些實驗來獲得繪圖函數期間的時間(即通過捕獲調用函數之前和之後的時間),然後將平均時間除以節點的數量以知道每個節點花費的時間。這可以在這裏使用分析來正式完成https://docs.python.org/2/library/profile.html –

+0

如果知道每個節點運行一個並行線程運行的時間之後,它會更直觀時間=節點數量*每個節點的時間和打印10%,20%......無論如何,讓我們知道它是否工作,這是一個有趣的問題。 –