2013-06-03 62 views
1

我想在python中用matplotlib創建一個動畫。由於動畫數據是兩個參數(時間,物體數量)的函數,我有一個想法使用2 for循環。代碼如下:matplotlib動畫情節雙循環

import time 
import matplotlib as mpl 
from matplotlib import pyplot as plt 
from matplotlib import pylab as plb 

# set up figure for plotting: 
fig = plt.figure() 
ax = fig.add_subplot(111) 

# plot limits 
ax.set_xlim(-(max(q0) + bodies[-1].L), +(max(q0) + bodies[-1].L)) 
ax.set_ylim(-(max(q0) + bodies[-1].L), +(max(q0) + bodies[-1].L)) 

# colors 
colors = ['b', 'g', 'c'] 


for i_t in range(0, np.shape(t)[1]): #t is an one column matrix 
    for i in range(0, N): 
     ax.plot(x_matrix[i_t, i], y_matrix[i_t, i], 's', color=colors[i]) 
    plt.draw() 
plt.show() 

問題是,代碼生成一個情節,但所有的動畫點。我想將一個時間值(計數器i_t)和所有物體(計數器i)的動畫繪製在一個窗口中作爲電影,以便在之後的時間步驟中刪除上一個繪圖。

我已經改變了你建議的代碼:

for i_t in range(0, np.shape(t)[1]): 
    for i in range(0, N): 
     ax.clear() 
     ax.plot(x_matrix[i_t, i], y_matrix[i_t, i], 's', color=colors[i]) 
     plt.pause(0.001) 
plt.draw() 

但後來我得到一個錯誤:

C:\Python27\lib\site-packages\matplotlib\backend_bases.py:2292: MatplotlibDeprecationWarning: Using default event loop until function specific to this GUI is implemented warnings.warn(str, mplDeprecation)

這不是那麼可怕,但運行代碼的點的時候,將有被繪製在一起(計數器i)被分開繪製,所以它看起來像blinkig點(如果你知道我的意思)。

有任何建議。我認爲我接近解決方案,但仍然需要用於代碼工作的整理工具。我希望這可以按照我想象的方式完成,所以我不必用不同的方法解決問題。

+0

你必須對每個i_t使用'show'命令。請記住,你用代碼將所有東西繪製在一個(!)圖中。也許你應該檢查matplotlib食譜動畫: http://www.scipy.org/Cookbook/Matplotlib/Animations 或者如果你想要一部電影,(可能是),檢查這個: http://debtechandstuff.blogspot .de/2009/10/created-video-of-3d-graph-plotting.html 一般而言,您必須自行繪製每個框架,然後將動畫製作出來。一個動畫的.gif很容易做到。 – Faultier

+1

您可以忽略該警告。 – tacaswell

+4

如果你只是用'set_data'替換數據,它會運行得更好,而不是每幀都吹走整個軸。 – tacaswell

回答

3

我已經解決了這個問題。解決的辦法是(會不會有人需要它):

for i_t in range(0, np.shape(t)[1]): 
    ax.clear() 
    plt.hold(True) 
    # plot limits 
    ax.set_xlim(-(max(q0) + bodies[-1].L), +(max(q0) + bodies[-1].L)) 
    ax.set_ylim(-(max(q0) + bodies[-1].L), +(max(q0) + bodies[-1].L)) 
    for i in range(0, N): 
     ax.plot(x_matrix[i_t, i], y_matrix[i_t, i], 's', color=colors[0, i]) 

    plt.pause(0.0001) 

我會貼earlyer,但作爲一個新的用戶,我不得不等待8個小時,回答我的問題。

+0

我試過'plt.pause()'。問題是我完成情節後退出。我如何避免這種情況? –

+0

嘗試將'plt.pause()'中的值從0.0001更改爲0.1? 是'plt.pause()'縮進爲內部(第二)'for'循環嗎? – avstenit

2

你的代碼的最後部分改成這樣:

for i_t in range(np.shape(t)[1]): #t is an one column matrix 
    for i in range(N): 
     ax.clear() 
     ax.plot(x_matrix[i_t, i], y_matrix[i_t, i], 's', color=colors[i]) 
     plt.pause(0.001) 
# eof 

plt.pause(0.001)改變號碼適應動畫速度。