在我工作的每一天,我都需要在一个通常很长的迭代过程中监控一些标量值(或显示图像)的演变。我想这是一个普遍的问题。
所以直到现在我在我的代码中有一个像这样构造的循环:
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