2015-10-14 62 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%......无论如何,让我们知道它是否工作,这是一个有趣的问题。 –