`matplotlib`: ¿cuál es el propósito del estado animado de un artista?

Los artistas en matplotlib tienen métodos para establecer / obtener su estado animado (un booleano). Parece que no puedo encontrar documentación para explicar el propósito de la variable “estado animado”. ¿Puede explicarme o indicarme un recurso apropiado?

No estoy seguro de que esté completamente documentado en ninguna parte, pero el estado animado de un artista controla si se incluye o no al dibujar la ttwig.

Si animated es Verdadero, el artista no se dibujará cuando se fig.draw() . En su lugar, solo se dibujará cuando se llame a draw_artist(artist_with_animated_set) . Esto permite la simplificación de las funciones de blitting.

Nota: ¡Esto no se aplica a todos los backends! Creo que se aplica a casi todos los backends interactivos, pero no se aplica a los backends no interactivos. Está diseñado para ser utilizado en combinación con blitting, por lo que los backends que no admiten blitting no son compatibles con la bandera animada.

Por ejemplo, si hacemos algo similar a esto:

 import matplotlib.pyplot as plt fig, ax = plt.subplots() ax.plot(range(10), animated=True) plt.show() 

Obtendremos un diagtwig en blanco – la línea no se dibujará. (Nota: si guarda esta figura, la línea aparecerá. Vea la advertencia sobre los backends no interactivos arriba. Matplotlib cambia temporalmente a un backend no interactivo para guardar una figura).

introduzca la descripción de la imagen aquí

Para tener una idea de por qué esto es útil, suponga que estaba haciendo una animación o una interfaz gráfica de usuario interactiva (y no estaba usando el nuevo marco de animación). Querrás usar blitting para hacer que la animación se vea “suave”.

Sin embargo, siempre que se cambie el tamaño de la figura, etc., será necesario actualizar el fondo de la animación. La mejor manera de manejar esto es conectar una callback al evento draw. Sin la bandera animated , tendrá que volver a dibujar la ttwig dentro de su callback de sorteo, lo que causará un bucle infinito. (La solución es desconectar y volver a conectar la callback del evento draw, pero eso es un poco molesto).

En cualquier caso, la bandera animada simplifica bastante este proceso. Por ejemplo, podría usar la bandera animated en algo similar a lo siguiente:

 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.restre_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: Por varias razones, sucederán algunas cosas extrañas en los backends OSX y qt * Agg. Si el fondo es negro cuando se abre la ventana por primera vez, mueva o enfoque la ventana y debería solucionarse.

En cualquier caso, sin la bandera animated (o el nuevo marco de animación), ese ejemplo se vuelve mucho más complejo.