matplotlib.pyplot/pylab在isinteractive()时不更新图形,使用ipython-pylab

2024-05-13 14:16:20 发布

您现在位置:Python中文网/ 问答频道 /正文

有很多关于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

任何帮助,即使只是“查找这个方法”都是很好的,所以我至少可以缩小我的努力范围,找出如何使用这个方法。如果还有什么有用的信息,请告诉我。


Tags: 代码in图形fortimeplotipython绘制
0条回答
网友
1楼 · 发布于 2024-05-13 14:16:20

您链接的问题的第二个答案提供了答案:在每个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楼 · 发布于 2024-05-13 14:16:20
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 OS下的pythonx2.7.3的spyder编辑器中运行了它。 注意在draw()后面跟着ioff()和show()的pause()语句。

网友
3楼 · 发布于 2024-05-13 14:16:20

在我的mac上运行ipython也有同样的问题。(MacBookPro上运行SnowLeopard的Python2.732bit的热情发行版)。

从一个工作上的朋友那里得到了小费。使用以下参数从终端运行ipython:

“ipython-wthread-pylab”

这对我有用。上面来自“Daniel G”的python代码运行时没有意外,而之前它没有更新绘图。

根据ipython文档:“[-gthread,-qthread,-q4thread,-wthread,-pylab:…]它们为GTK、Qt(版本3和版本4)和WXPython工具包以及matplotlib库提供线程支持。” 我不知道为什么这很重要,但它起作用了。

希望对你有帮助, 拉布朱基

相关问题 更多 >