2010-04-08 50 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