每k次迭代显示matplotlib图的最具Python风格的方法

每k次迭代显示matplotlib图的最具Python风格的方法,python,matplotlib,plot,Python,Matplotlib,Plot,每天在我的工作中,我都需要监控一些标量值(或显示图像)在一个通常非常长的迭代过程中的演变。我想这是一个常见的问题 所以直到现在,我的代码中都有这样一个循环: scalar_value1_vector=[] scalar_value2_vector=[] iterations_vector=[] N=999999999999999999 display_steps=100 for i in xrange(N): new_scalar_value1, new_scalar_value2=per

每天在我的工作中,我都需要监控一些标量值(或显示图像)在一个通常非常长的迭代过程中的演变。我想这是一个常见的问题

所以直到现在,我的代码中都有这样一个循环:

scalar_value1_vector=[]
scalar_value2_vector=[]
iterations_vector=[]
N=999999999999999999
display_steps=100

for i in xrange(N):
  new_scalar_value1, new_scalar_value2=perform some calculations(...)
  if (i%display_steps==0):
    scalar_value1_vector.append(new_scalar_value1)
    scalar_value2_vector.append(new_scalar_value2)
    iterations_vector.append(i)
    plt.plot(iterations, scalar_value1, "Scalar value 1")
    plt.plot(iterations, scalar_value2, "Scalar value 2")
    plt.legend()
运行它时,matplotlib会发出各种各样的反对警告,说我不应该这样做。(加上绘图在每次迭代中仅处于“活动”状态,并且在每次迭代之间变为非交互和黑色)。我想他们希望我使用
matplotlib.animation
对象,但对于我的需要来说,它似乎有点太复杂了(但也许这是一种方法?)

对于基本绘图,最简单、最轻量级和最优雅的解决方案是什么? 它是否也适用于图像打印(通过
plt.imshow
获得)

编辑:我想是相关的

编辑1:我使用了
fig.canvas.draw\u idle()
ax.set\u data()
fig.canvas.flush\u events()
结合使用,但它始终没有响应

scalar_value1_vector=[]
scalar_value2_vector=[]
iterations_vector=[]
N=999999999999999999
display_steps=100
plt.ion()
fig, ax=plt.subplots()
sc1,=ax.plot(steps,scalar_value1_vector, label="Scalar value 1")
sc2,=ax.plot(steps,scalar_value2_vector, label="Scalar value 2")
plt.legend()

for i in xrange(N):
  #calculations that take on average 3 seconds (+-1s)
  new_scalar_value1, new_scalar_value2=perform some calculations(...)
  if (i%display_steps==0):
    scalar_value1_vector.append(new_scalar_value1)
    scalar_value2_vector.append(new_scalar_value2)
    iterations_vector.append(i)
    sc1.set_data(steps,scalar_value1_vector)
    sc2.set_data(steps,scalar_value2_vector)
    fig.canvas.draw_idle()
    try:
      fig.canvas.flush_events()
    except NotImplementedError:
      pass

有关交互式打印和动画之间的比较,请参见,例如,或可能是图像。然而,“最佳”解决方案肯定取决于
执行某些计算(…)
所需的时间,以及所需的时间是否可以预测或恒定。执行计算并在绘图中显示中间步骤的最省钱的方法显然是使用线程;但这既不是简单的方法,也不是最轻量级的方法。谢谢你的回答,我最关心的是简单性和效率(我知道有时两者并不同时存在)。在我的例子中,执行一些计算执行时间在某种程度上是已知的。最简单的解决方案可能是交互式模式。您还可以查看,其中
fig.canvas.flush\u events()
确保窗口不会无响应。好的,我会在接下来的几天内发布更新的答案,如果您没有