2015-05-09 9 views

risposta

6

Non sono sicuro che sia stato accuratamente documentato ovunque, ma lo stato animato di un artista controlla se è incluso o meno quando si disegna la trama.

Se animated è True, l'artista non verrà disegnato quando viene chiamato fig.draw(). Invece, verrà disegnato solo quando si chiama manualmente draw_artist(artist_with_animated_set). Ciò consente una semplificazione delle funzioni di blitting.

Nota: questo non si applica a tutti i backend! Penso che si applichi a quasi tutti i backend interattivi, ma non si applica ai backend non interattivi. È pensato per essere utilizzato in combinazione con il blitting, quindi i backend che non supportano il blitting non supportano la bandiera animata.

Per esempio, se facciamo qualcosa di simile a questo:

import matplotlib.pyplot as plt 

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

Otterremo una trama in bianco - la linea non sarà disegnata. (Nota: se si salva questa figura, la linea sarà presentarsi Vedere l'avvertenza circa backend non interattive di cui sopra Matplotlib passa temporaneamente ad un back-end non interattivo per salvare una figura...)

enter image description here

Per capire perché questo è utile, supponi di creare un'animazione o un'interfaccia interattiva (e non stavi usando il nuovo framework di animazione). Dovrai usare il blitting per rendere l'animazione "liscia".

Tuttavia, ogni volta che la figura viene ridimensionata, ecc, lo sfondo dell'animazione dovrà essere aggiornato. Il modo migliore per gestirlo è connettere un callback all'evento draw. Senza il flag animated, sarà necessario ridisegnare la trama all'interno del del richiamo dell'estrazione, che causerà un ciclo infinito. (La soluzione alternativa è disconnettere e riconnettere la richiamata dell'evento draw, ma è un po 'un problema.)

In ogni caso, la bandiera animata semplifica un po' questo processo. Ad esempio, è possibile utilizzare il flag animated in qualcosa di simile al seguente:

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

Nota: Per vari motivi, avrete alcune cose strane accadono sulla OSX e QT * backend Agg. Se lo sfondo è nero quando viene visualizzata la finestra per la prima volta, spostare o mettere a fuoco la finestra e dovrebbe risolverlo.

In ogni caso, senza il flag animated (o il nuovo framework di animazione), tale esempio diventa molto più complesso.

+0

Grazie mille! – user89

+0

Prima di tutto, grazie per aver risposto a questo, soprattutto perché non è da nessuna parte nei documenti. Però non capisco perfettamente il tuo esempio. L'unica differenza quando non si utilizza l'opzione 'animated = True' nell'esempio è che la linea viene tracciata nella prima chiamata per disegnare e di conseguenza viene salvata sullo sfondo. È questo l'unico scopo? – toes

+1

@toes: questa è la differenza principale. Ancora più importante, qualsiasi chiamata a 'draw' ignorerà l'artista che ha impostato' animated = True'. Deve sempre essere disegnato manualmente (cioè non è solo la prima volta). Lo scopo principale (solo?), Come hai giustamente menzionato, è di evitare che l'artista animato faccia parte dello sfondo. –