2015-04-02 106 views
4

我目前使用matplotlib.animation.FuncAnimation()在圖上顯示我的作品的動畫。如何將時間控制面板添加到matplotlib的FuncAnimation中

它運行得非常好,我理解我正在使用的參數(間隔,時間範圍,...)但是,我想知道是否有一種方法來實現(也許直接到圖)動畫,滾動條或任何,這使我可以:

  • 快速前進或後退快速到感興趣的時區。
  • 顯示我在動畫的哪一點(10%,然後是20%,...)。

基本上,是一種控制python中動畫的方式,就像我將其控制爲視頻播放器播放的視頻文件一樣?

如果需要的話,這是什麼樣子這個動畫代碼:

def init(): 
     im1.set_data(XYslice[0, :, :]) 
     im2.set_data(XZslice[0, Nplans/2:, :]) 
     return([im1, im2]) 

    def animate(t): 
     im1.set_data(XYslice[t, :, :]) 
     im2.set_data(XZslice[t, Nplans/2:, :]) 
     return [im1, im2] 

    anim = animation.FuncAnimation(fig, animate, np.arange(Ntime), interval=200, 
           blit=True, init_func=init, repeat=True) 

回答

3

你所談論的是一個GUI。最簡單的例子使用matplotlib內置widgets

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.mlab import bivariate_normal 
from matplotlib.widgets import Slider, Button 

#Setup figure and data 
fig, ax = plt.subplots() 
plt.subplots_adjust(bottom=0.25) 
delta = 0.5 
t = np.arange(0.0, 100.0, 0.1) 
x = np.arange(-3.0, 4.001, delta) 
y = np.arange(-4.0, 3.001, delta) 
X, Y = np.meshgrid(x, y) 
Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 
Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1) 
Z = (Z1 - Z2) * 5. 
cmap = plt.cm.rainbow 
im = ax.pcolormesh(X, Y, Z, cmap=cmap) 
fig.colorbar(im) 
axcolor = 'lightgoldenrodyellow' 
axtime = plt.axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor) 
stime = Slider(axtime, 'Time', 0.0, 100.0, valinit=50.0) 

#Routines to reset and update sliding bar 
def reset(event): 
    stime.reset() 

def update(val): 
    time = stime.val/10. 
    Z = (Z1 - Z2) * time 
    im.set_array(Z.ravel()) 
    fig.canvas.draw() 

#Bind sliding bar and reset button 
stime.on_changed(update) 
resetax = plt.axes([0.8, 0.025, 0.1, 0.04]) 
button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975') 
button.on_clicked(reset) 

plt.show() 

這應該是一個開始。如果您希望它看起來更好(並添加更多功能),那麼您需要轉到諸如wxpython之類的GUI框架,查看this示例。

其中一個例子是更多的在線與您的數據結構會去如下:

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.mlab import bivariate_normal 
from matplotlib.widgets import Slider, Button 

#Setup figure and data 
fig, ax = plt.subplots() 
plt.subplots_adjust(bottom=0.25) 
delta = 0.5 
t = np.linspace(0.0, 100.0, 256) 
x = np.linspace(-4.0, 4.001, 512) 
y = np.linspace(-4.0, 4.001, 512) 
X, Y = np.meshgrid(x, y) 
Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) 
Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1) 
XZslice = np.zeros((256,512,512)) 
for i in range(t.shape[0]): 
    XZslice[i,:,:] = (Z1 - Z2) * t[i]/10. 
cmap = plt.cm.rainbow 
im = ax.pcolormesh(XZslice[128,:,:], cmap=cmap) 
fig.colorbar(im) 
axcolor = 'lightgoldenrodyellow' 
axtime = plt.axes([0.25, 0.1, 0.65, 0.03], axisbg=axcolor) 
stime = Slider(axtime, 'Time', 0.0, 100.0, valinit=50.0) 

#Routines to reset and update sliding bar 
def reset(event): 
    stime.reset() 

def update(val): 
    time = int(stime.val/100.* 256) 
    im.set_array(XZslice[time,:,:].ravel()) 
    fig.canvas.draw() 

#Bind sliding bar and reset button 
stime.on_changed(update) 
resetax = plt.axes([0.8, 0.025, 0.1, 0.04]) 
button = Button(resetax, 'Reset', color=axcolor, hovercolor='0.975') 
button.on_clicked(reset) 

plt.show() 
+0

這是偉大的! 我很高興能嘗試將它適應於我的工作。 非常感謝! – Magea 2015-04-02 11:24:27

+0

你給我的東西太棒了。 但是我太熱心了,現在遇到了麻煩,無法與我的具體情況一起工作。 我不知道如何用我的數據替換您選擇顯示的數據作爲示例。 我有一個文件有形狀:256,512,512。 256是時間點,並且兩個512分別用於X和Y. 我認爲我所有的麻煩都來自Z的含義,以及如何在您的示例中使用它。 – Magea 2015-04-02 12:10:09

+0

當您第一次啓動時,GUI編程有點奇怪。我已經添加了一個版本,通過256,512,512大小的數組結果進行移動。主要要注意的是'stime'被實例化爲一個滑塊對象,'stime.on_changed(update)'綁定了例程'update',所以每當滑塊改變值時這個例程被調用,'stime.val'給出滑塊上的當前值。我以爲你想要一個色網。如果要繪製線數據,可以爲y位置添加一個滑塊,以更改陣列上的索引。 – 2015-04-02 12:32:28