大多数pythonic方式显示matplotlib绘制每k次迭代

时间:2017-07-31 13:12:12

标签: 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=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获得?)?

编辑:我猜this question是相关的

编辑1 :我将fig.canvas.draw_idle()ax.set_data()fig.canvas.flush_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

0 个答案:

没有答案