python 2中的pylab.ion(),matplotlib 1.1.1和程序运行时的绘图更新

我想要做的是有一个脚本计算的东西,准备一个情节,并显示已经获得的结果作为pylab.figure – 在一个稳定的matplotlib(1.1.1)的Python 2(特别是Python 2.7)。

在python 3(python 3.2.3与matplotlib git build …版本1.2.x),这工作正常。 作为一个简单的例子(通过time.sleep()模拟一个冗长的计算)考虑

import pylab import time import random dat=[0,1] pylab.plot(dat) pylab.ion() pylab.draw() for i in range (18): dat.append(random.uniform(0,1)) pylab.plot(dat) pylab.draw() time.sleep(1) 

在python 2(版本2.7.3 vith matplotlib 1.1.1)中,代码运行干净没有错误,但不显示数字。 python2解释器的一个小小的试验和错误似乎build议用pylab.show()replacepylab.draw(); 这样做一次显然是足够的(而不是像绘图在每次改变/添加到绘图之后调用它)。 因此:

 import pylab import time import random dat=[0,1] pylab.plot(dat) pylab.ion() pylab.show() for i in range (18): dat.append(random.uniform(0,1)) pylab.plot(dat) #pylab.draw() time.sleep(1) 

但是,这也不起作用。 同样,它运行干净,但没有显示数字。 这似乎只在等待用户input时才这样做。 我不清楚这是为什么,但是当raw_input()被添加到循环中时,情节终于显示出来了

 import pylab import time import random dat=[0,1] pylab.plot(dat) pylab.ion() pylab.show() for i in range (18): dat.append(random.uniform(0,1)) pylab.plot(dat) #pylab.draw() time.sleep(1) raw_input() 

有了这个,脚本当然会等待用户input,同时显示的情节,并不会继续计算数据之前,用户命中input。 这当然不是这个意图。

这可能是由不同版本的matplotlib(1.1.1和1.2.x)或不同的python版本(2.7.3和3.2.3)造成的。

有没有什么办法可以用python 2和stable(1.1.1)matplotlib来完成上面的脚本(第一个)在python 3,matplotlib 1.2.x中所做的: – 计算数据(在上面的例子中需要一段时间由循环或迭代函数中的time.sleep()模拟,以及 – (在仍然计算时)显示之前迭代中已经计算的内容 – 并且不打扰用户不断地敲击input以继续计算

谢谢; 我会很感激任何帮助…

你需要pausefunction给GUI框架重画屏幕的机会:

 import pylab import time import random import matplotlib.pyplot as plt dat=[0,1] fig = plt.figure() ax = fig.add_subplot(111) Ln, = ax.plot(dat) ax.set_xlim([0,20]) plt.ion() plt.show() for i in range (18): dat.append(random.uniform(0,1)) Ln.set_ydata(dat) Ln.set_xdata(range(len(dat))) plt.pause(1) print 'done with loop' 

您不需要每次传递都创build一个新的Line2D对象,只需更新现有数据即可。

文档:

 pause(interval) Pause for *interval* seconds. If there is an active figure it will be updated and displayed, and the gui event loop will run during the pause. If there is no active figure, or if a non-interactive backend is in use, this executes time.sleep(interval). This can be used for crude animation. For more complex animation, see :mod:`matplotlib.animation`. This function is experimental; its behavior may be changed or extended in a future release. 

一个真正的超杀方法是使用matplotlib.animate模块。 另一方面,如果你愿意的话,它会给你一个很好的保存数据的方法(从我的答案中剥离出来,以1秒为单位连续表示 )。

例如 , API , 教程

有些后台(以我的经验“Qt4Agg”)需要pausefunction,正如@tcaswellbuild议的那样。

其他后端(在我的经验“TkAgg”)似乎只是更新draw()而不需要pause 。 所以另一个解决scheme是切换你的后端 ,例如matplotlib.use('TkAgg')