2010-04-08 22 views
16

关于matplotlib,pylab,pyplot,ipython有很多问题,所以我很抱歉,如果你不满意看到这个问题。我会尽量具体,因为我一直在关注人们的问题,并查看pyplot和pylab的文档,但我仍然不确定自己做错了什么。与代码:matplotlib.pyplot/pylab没有更新数字而isinteractive(),使用ipython -pylab

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

我在编码这种尝试如下(在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”将是优秀的,所以我至少可以缩小我的努力搞清楚如何使用该方法。如果还有更多有用的信息,请告诉我。

+1

[你应该使用'pyplot.pause'而不是'time.sleep'。](http://stackoverflow.com/questions/12822762/pylab-ion-in-python-2-matplotlib-1-1- 1-and-the-the-the-pro-the-pro) – 2013-06-05 23:36:43

+0

我在Windows上使用QT4Agg后端时遇到了同样的问题,我相信它与这个[github问题](https://github.com)有关/ matplotlib/matplotlib/issues/1646),使用pyplot.pause()修复它。 – seumas 2013-08-12 11:13:31

回答

10

您链接的问题的第二个答案提供了答案:在每个plot()之后拨打draw()使其立即出现;例如:

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

由于某种原因,这不适合我。我毫不怀疑这是对的,我只是不确定它为什么不适合我。只要第一个打印,我会看到一个空白窗口10秒钟;之后出现所有图形。但draw()似乎并没有强制更新,直到超出for循环。我刚开始(尝试)使用matplotlib-这可能与我听说过的“后端”有关吗? (我不知道那是什么= /) – NumberOverZero 2010-04-09 00:03:52

+1

@NumberOverZero - 你在使用什么平台? (Windows/Mac/Linux ...) – 2010-04-09 00:11:28

+0

Vista Ult 64,Python 2.6.2 – NumberOverZero 2010-04-09 00:17:14

0

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

matplotlib.use('GTkAgg') 

并且还安装PyGTK。

4

与运行在我的mac上的ipython有完全相同的问题。 (喜欢在Macbook Pro上运行雪豹的python 2.7 32bit的分布)。

从工作中的朋友那里得到一个提示。从终端使用以下参数运行IPython中:

“IPython中-wthread -pylab”

这对我的作品。上述来自“Daniel G”的Python代码没有发生意外运行,而之前它并没有更新剧情。根据ipython文档:“[-gthread,-qthread,-q4thread,-wthread,-pylab:...]它们为GTK,Qt(版本3和4)和WXPython工具包提供线程支持,和matplotlib库。“ 我不知道为什么这很重要,但它的工作原理。

希望是有帮助的, labjunky

+1

此-wthread标志为我解决了类似的问题,图形窗口锁定在关闭状态。谢谢! – wim 2011-06-14 04:51:26

+0

可悲的是-wthread被[在ipython 0.11中删除](http://ipython.org/ipython-doc/stable/interactive/reference.html#eventloop-integration)。是否有其他方法可以使它工作? – 2013-07-12 07:46:45

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操作系统下使用spyder编辑器在pythonxy2.7.3中运行它。 请注意draw()后跟随ioff()和show()的pause()语句。

+0

什么都不是为我工作(也赢了7),直到我添加了停顿(声明)。谢谢 – 2014-02-18 17:43:35