matplotlib.pyplot / pylab在isinteractive()时不使用ipython -pylab更新数字

时间:2010-04-08 23:25:44

标签: python matplotlib

有很多关于matplotlib,pylab,pyplot,ipython的问题,所以如果你厌倦了看到这个问题,我很抱歉。我会尝试尽可能具体,因为我一直在查看人们的问题并查看pyplot和pylab的文档,我仍然不确定我做错了什么。使用代码:

目标:每隔0.5秒绘制一个数字,并在调用plot命令后立即更新数字。

我尝试对此进行编码(在ipython -pylab上运行):


import time
ion()
x=linspace(-1,1,51)
plot(sin(x))
for i in range(10):
    plot([sin(i+j) for j in x])
    #see **
    print i
    time.sleep(1)
print 'Done'

它正确绘制每一行,但直到它退出for循环。我试图通过将draw()放在**的位置来强制重绘,但这似乎也不起作用。理想情况下,我想简单地添加每一行,而不是完全重绘。如果需要重绘,那很好。

解决的其他尝试: 在ion()之后,尝试添加hold(True)无济于事。
show()尝试了** 我找到的最接近的答案就是plotting lines without blocking execution,但是show()没有做任何事。

如果这是一个简单的请求,我道歉,我正在寻找一些如此明显的东西。值得一提的是,当我尝试将matlab代码从类转换为某些python供我自己使用时,这就出现了。我尝试转换的原始matlab(已删除初始化)如下:


for i=1:time
    plot(u)
    hold on
    pause(.01)
    for j=2:n-1
        v(j)=u(j)-2*u(j-1)
    end
    v(1)= pi
    u=v
end

任何帮助,即使它只是“查找this_method”也会非常好,所以我至少可以缩小我的努力来弄清楚如何使用这种方法。如果有更多有用的信息,请告诉我。

4 个答案:

答案 0 :(得分:10)

from pylab import *
import time
ion()
tstart = time.time()               # for profiling
x = arange(0,2*pi,0.01)            # x-array
line, = plot(x,sin(x))
for i in arange(1,200):
    line.set_ydata(sin(x+i/10.0))  # update the data
    draw()                         # redraw the canvas
    pause(0.01)
print 'FPS:' , 200/(time.time()-tstart)
ioff()
show()

以上对我很有帮助。我在win7操作系统下的pythonxy2.7.3中的spyder编辑器中运行它。 请注意draw()后面的pause()语句,然后是ioff()和show()。

答案 1 :(得分:9)

您链接的问题的第二个答案提供了答案:在draw()之后致电plot()以使其立即显示;例如:

import time
ion()
x = linspace(-1,1,51)
plot(sin(x))
for i in range(10):
    plot([sin(i+j) for j in x])
    # make it appear immediately
    draw()
    time.sleep(1)

如果这不起作用...请尝试在此页面上执行的操作:http://www.scipy.org/Cookbook/Matplotlib/Animations

import time

ion()

tstart = time.time()               # for profiling
x = arange(0,2*pi,0.01)            # x-array
line, = plot(x,sin(x))
for i in arange(1,200):
    line.set_ydata(sin(x+i/10.0))  # update the data
    draw()                         # redraw the canvas

print 'FPS:' , 200/(time.time()-tstart)

该页面提到line.set_ydata()功能是关键部分。

答案 2 :(得分:5)

在我的mac上运行ipython时遇到了完全相同的问题。 (在Macbook pro上运行雪豹的蟒蛇2.7 32位的Enthought分布)。

得到朋友的工作提示。使用以下参数从终端运行ipython:

“ipython -wthread -pylab”

这对我有用。来自“Daniel G”的上述python代码没有发生任何事故,而之前它没有更新情节。

根据ipython文档:“ - -gthread,-qthread,-q4thread,-wthread,-pylab:...]它们为GTK,Qt(版本3和4)和WXPython工具包提供了线程支持,并且对于matplotlib库。“ 我不知道为什么这很重要,但它确实有效。

希望有帮助, labjunky

答案 3 :(得分:0)

请参阅此处发布的answer类似问题。只使用 GTKAgg 后端,我可以毫无问题地生成动画。为此,您需要将此行添加到脚本中(我想在导入pylab之前):

matplotlib.use('GTkAgg')

并安装PyGTK。