2015-05-09 8 views

Antwort

6

Ich bin mir nicht sicher, ob es irgendwo gründlich dokumentiert ist, aber der animierte Zustand eines Künstlers steuert, ob er beim Zeichnen des Plots enthalten ist oder nicht. Wenn animated True ist, wird der Künstler nicht gezeichnet, wenn fig.draw() aufgerufen wird. Stattdessen wird es nur gezeichnet, wenn Sie draw_artist(artist_with_animated_set) manuell aufrufen. Dies ermöglicht eine Vereinfachung der Blitting-Funktionen.

Hinweis: Dies gilt nicht für alle Backends! Ich denke, es gilt für fast alle interaktiven Backends, aber nicht für nicht interaktive Backends. Es sollte in Kombination mit Blitting verwendet werden, sodass Backends, die Blitting nicht unterstützen, die animierte Flagge nicht unterstützen.

Zum Beispiel, wenn wir etwas tun, wie folgt aus:

import matplotlib.pyplot as plt 

fig, ax = plt.subplots() 
ax.plot(range(10), animated=True) 
plt.show() 

Wir werden ein leeres Grundstück erhalten - die Linie nicht gezogen werden. (Hinweis: Wenn Sie diese Zahl speichern, die Linie wird zeigt nach oben Siehe Vorbehalt über nicht-interaktiven Backends über Matplotlib vorübergehend schaltet in einen nicht interaktiven Backend eine Zahl zu speichern...)

enter image description here

Um zu verstehen, warum dies sinnvoll ist, nehmen Sie an, Sie würden eine Animation oder interaktive GUI erstellen (und nicht das neue Animationsframework verwenden). Sie sollten Blitting verwenden, um die Animation "glatt" erscheinen zu lassen.

Immer wenn die Größe der Figur geändert wird usw., muss der Hintergrund der Animation aktualisiert werden. Der beste Weg, dies zu handhaben, ist, einen Rückruf mit dem Zeichenereignis zu verbinden. Ohne das Flag animated müssen Sie das Plot innerhalb Ihren Zeichenrückruf neu zeichnen, der eine Endlosschleife verursacht. (Die Problemumgehung besteht darin, den Rückruf des Zeichenereignisses zu trennen und erneut zu verbinden, aber das ist ein bisschen mühsam.)

In jedem Fall vereinfacht die animierte Flagge diesen Vorgang ein wenig. Zum Beispiel könnten Sie die animated Flagge in etwas ähnlich der folgenden verwenden:

import numpy as np 
import matplotlib.pyplot as plt 

class AnimatedSinWave(object): 
    def __init__(self, speed=0.1, interval=25): 
     self.fig, self.ax = plt.subplots() 
     self.x = np.linspace(0, 6 * np.pi, 200) 
     self.i, self.speed = 0.0, speed 

     self.line, = self.ax.plot(self.x, np.sin(self.x), animated=True) 
     self.ax.set_title('Try resizing the figure window') 

     self.fig.canvas.mpl_connect('draw_event', self.update_background) 
     self.t = self.fig.canvas.new_timer(interval, [(self.update, [], {})]) 
     self.t.start() 

    def update_background(self, event): 
     self._background = self.fig.canvas.copy_from_bbox(self.ax.bbox) 

    def update(self): 
     self.fig.canvas.restore_region(self._background) 

     self.line.set_ydata(np.sin(self.i * self.speed + self.x)) 
     self.ax.draw_artist(self.line) 
     self.i += 1 

     self.fig.canvas.blit(self.ax.bbox) 

    def show(self): 
     plt.show() 

AnimatedSinWave().show() 

Hinweis: Aus verschiedenen Gründen, werden Sie ein paar seltsame Dinge passieren auf dem OSX und qt * Agg Backends haben. Wenn der Hintergrund schwarz ist, wenn das Fenster zum ersten Mal erscheint, verschieben oder fokussieren Sie das Fenster und es sollte sich selbst reparieren.

Auf jeden Fall, ohne die animated Flag (oder das neuere Animation Framework), das Beispiel wird viel komplexer.

+0

Vielen Dank! – user89

+0

Zunächst einmal, vielen Dank für die Beantwortung dieser Frage, vor allem, weil es nirgendwo in der Dokumentation ist. Ich verstehe dein Beispiel jedoch nicht vollständig. Der einzige Unterschied, wenn Sie in Ihrem Beispiel nicht die Option 'animated = True' verwenden, ist, dass die Linie im ersten Aufruf gezeichnet wird und somit im Hintergrund gespeichert wird. Ist das der einzige Zweck? – toes

+1

@toes - Das ist der Hauptunterschied. Noch wichtiger ist, dass alle Aufrufe von "draw" den Künstler ignorieren, der "animated = True" gesetzt hat. Es muss immer manuell gezeichnet werden (d. H. Es ist nicht nur das erste Mal). Der Hauptgrund (nur?), Wie Sie richtig erwähnt haben, ist zu vermeiden, dass der animierte Künstler jemals Teil des Hintergrunds ist. –

Verwandte Themen