2016-04-01 39 views
0

如果初始幀中的所有條目都包含相同的值,我似乎無法獲得圖像的TimedAnimation動畫以顯示任何內容。例如,如果指定的行保留註釋,則以下內容不會顯示任何內容。更改第一幀以包含np.ones(self.shape)也沒有任何作用。matplotlib如果第一幀中的所有條目都是相同的,則不顯示圖像動畫

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as anim 

class MyAnimation(anim.TimedAnimation): 
    def __init__(self): 
     fig = plt.figure() 
     self.shape = (10, 10) 
     data = np.zeros(self.shape) 
     # data.flat[0] = 1 # uncomment this to get the animation to display   
     self.ax = plt.imshow(data) 
     super(self.__class__, self).__init__(fig, interval=50, blit=True) 

    def _draw_frame(self, framedata): 
     data = np.random.rand(*self.shape) 
     self.ax.set_data(data) 

    def new_frame_seq(self): 
     return iter(range(100)) 

ani = MyAnimation() 

關閉blitting似乎沒有任何效果。改變後端似乎也沒有任何區別;我試過Qt4Agg和nbagg(後者通過Jupyter notebook 4.1.0),結果相同。我在Python 2.7.11中使用numpy 1.10.4和matplotlib 1.5.1。

是否預期了上述行爲?如果不是,當我的第一幀是空白或實心圖像時,我應該做些什麼來讓動畫顯示?

+0

如果你明確地將'vmin'和'vmax'傳遞給'imshow',它會起作用嗎? – tacaswell

回答

1

設置數據不會重新計算顏色限制。在所有輸入值相同的情況下,最小/最大值會自動縮放爲相同的值,因此您永遠不會看到數據被更新。你可以明確地設置初始化

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.animation as anim 

class MyAnimation(anim.TimedAnimation): 
    def __init__(self, ax=None): 
     if ax is None: 
      fig, ax = plt.subplots() 

     self.shape = (10, 10) 
     data = np.zeros(self.shape) 
     self.im = ax.imshow(data, vmin=0, vmax=1) 
     super(self.__class__, self).__init__(ax.figure, interval=50, blit=True) 

    def _draw_frame(self, framedata): 
     data = np.random.rand(*self.shape) 
     self.im.set_data(data) 

    def new_frame_seq(self): 
     return iter(range(100)) 

ani = MyAnimation() 

限制或_draw_frame方法使用self.im.set_clim

我也不確定子分類TimedAnimation是做任何你想做的事情的最簡單的方法(FuncAnimation非常靈活)。

+0

感謝 - 設置vmin/vmax的伎倆。在這個玩具的例子中,'TimedAnimation'確實不是必需的,但我問了這個問題,因爲我發現在更加複雜的場景中使用它會更方便,在這個場景中我明確地保存/訪問類實例中的某些變量。 – lebedov

相關問題