2016-04-01 20 views
0

Ich kann anscheinend keine TimedAnimation Animation eines Bildes erhalten, um irgendetwas anzuzeigen, wenn alle Einträge im ursprünglichen Bild den gleichen Wert enthalten. Zum Beispiel zeigt das Folgende nichts an, wenn die angezeigte Zeile auskommentiert bleibt. Das Ändern des ersten Rahmens, der np.ones(self.shape) enthält, hat ebenfalls keine Auswirkung.matplotlib Bildanimation wird nicht angezeigt, wenn alle Einträge im ersten Bild identisch sind

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 ausschalten scheint keine Wirkung zu haben. Das Ändern des Backends scheint auch keinen Unterschied zu machen; Ich habe Qt4Agg und nbagg (letzteres über Jupyter Notebook 4.1.0) mit den gleichen Ergebnissen ausprobiert. Ich benutze numpy 1.10.4 und matplotlib 1.5.1 mit Python 2.7.11.

Wird das obige Verhalten erwartet? Wenn nicht, sollte ich etwas tun, damit die Animation angezeigt wird, wenn das erste Bild ein leeres oder ein Vollbild ist?

+0

funktioniert es, wenn Sie 'vmin' und' vmax' explizit an 'imshow' übergeben? – tacaswell

Antwort

1

Beim Festlegen der Daten werden die Farblimits nicht erneut berechnet. Wenn alle Eingabewerte gleich sind, werden die Min/Max-Werte automatisch auf denselben Wert skaliert. Daher werden die Daten nie aktualisiert. Sie können entweder explizit die Grenzen init

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() 

oder self.im.set_clim im _draw_frame Methode verwenden.

Ich bin mir auch nicht sicher, dass Sub-Classing TimedAnimation ist der einfachste Weg zu tun, was auch immer Sie versuchen zu tun (FuncAnimation ist ziemlich flexibel).

+0

Danke - Einstellung vmin/vmax hat den Trick gemacht. '' TimedAnimation'' ist zwar in diesem Spielzeugbeispiel nicht notwendig, aber ich habe danach gefragt, weil ich es in einem komplizierteren Szenario, in dem ich bestimmte Variablen in der Klasseninstanz explizit speichere/zugreife, praktischer finde. – lebedov