【问题标题】:Return progress status when drawing a large NetworkX graph绘制大型 NetworkX 图时返回进度状态
【发布时间】:2016-01-12 15:26:13
【问题描述】:
  • 我正在绘制一个需要很长时间才能绘制的大图 过程。
  • 是否可以返回绘图当前状态的statuscurrent_nodepercentage
  • 我不打算逐步绘制网络,因为我所做的只是将其保存为高 dpi 图像。

这是我正在使用的代码示例:

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

【问题讨论】:

    标签: python-2.7 matplotlib graph networkx


    【解决方案1】:

    我相信这样做的唯一方法是容纳绘制函数的源代码以打印 10%、20% 完成的内容....但是当我检查 source code of draw_networkx_nodes & draw_networkx 时,我意识到这不是直截了当的任务,因为 draw 函数将位置(节点和边)存储在一个 numpy 数组中,将其发送到 matplotlib (sourcecode) 的 ax.scatter 函数,这在不弄乱某些东西的情况下有点难以操作。我唯一能想到的就是改变:

    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 函数中花费了多少时间。我还查看了 scatter 函数的源代码,但我无法确定循环或其他内容来打印已完成某些进展的指示。

    【讨论】:

    • 这听起来足以通过在每个部分的开头插入一个日志语句来报告状态:例如“状态:存储 %d 个节点”%len(nodes)。甚至可以在相同的地方添加一些时序语句,并设置测试用例来通过实验了解问题的顺序。
    • 是的,您可以查看 matplotlib 的 scatter 源代码以获得更详细的状态。另一个想法是做一些实验来获取绘制函数期间经过的时间(即通过捕获调用函数之前和之后的时间),然后将平均时间除以节点数,以了解每个节点所花费的时间。这可以在docs.python.org/2/library/profile.html 使用 profiling 正式完成
    • 如果在知道每个节点运行并行线程的时间之后运行时间 = 节点数 * 每个节点的时间并打印 10%, 20% ,它也会更加直观。 .. 无论如何,让我们知道它是否有效,这是一个有趣的问题。
    • 我认为虽然答案非常有效,但我认为这超出了我打算做的事情,并且可能暂时搁置这个想法,看看它是真正的“要求”还是“很高兴拥有” ”。我真的不想乱搞 NetworkX 基础代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2013-10-13
    • 2017-07-06
    相关资源
    最近更新 更多