Tabla de contenido

  • Animación
  • Clases de escritores
  • Clases de ayudantes
  • Diagramas de herencia

Animación

La forma más fácil de hacer una animación en vivo en matplotlib es usar uno de los Animation clases.

Animation Una clase base para animaciones.
FuncAnimation Hace una animación llamando repetidamente a una función func.
ArtistAnimation Animación usando un conjunto fijo de Artist objetos.

En ambos casos, es fundamental mantener una referencia al objeto de instancia. La animación avanza mediante un temporizador (normalmente desde el marco de la GUI del host) que el Animation objeto tiene la única referencia a. Si no tiene una referencia al Animation objeto, él (y por lo tanto los temporizadores), será recolectado como basura que detendrá la animación.

Para guardar una animación en el uso del disco Animation.save o Animation.to_html5_video

Ver Clases de ayudantes a continuación para obtener detalles sobre qué formatos de película son compatibles.

FuncAnimation

El funcionamiento interno de FuncAnimation es más o menos:

for d in frames:
   artists = func(d,*fargs)
   fig.canvas.draw_idle()
   fig.canvas.start_event_loop(interval)

con detalles para manejar ‘blitting’ (para mejorar dramáticamente el rendimiento en vivo), no bloquear, no iniciar / detener repetidamente el bucle de eventos de la GUI, manejar repeticiones, múltiples ejes animados y guardar fácilmente la animación en un archivo de película.

‘Blitting’ es un técnica estándar en gráficos por computadora. La esencia general es tomar un mapa de bits existente (en nuestro caso, una figura en su mayoría rasterizada) y luego ‘blit’ a un artista más en la parte superior. Por lo tanto, al administrar un mapa de bits ‘limpio’ guardado, solo podemos volver a dibujar los pocos artistas que están cambiando en cada fotograma y posiblemente ahorrar una cantidad significativa de tiempo. Cuando usamos blitting (pasando blit=True), el bucle central de FuncAnimation se vuelve un poco más complicado:

ax = fig.gca()defupdate_blit(artists):
    fig.canvas.restore_region(bg_cache)for a in artists:
        a.axes.draw_artist(a)

    ax.figure.canvas.blit(ax.bbox)

artists = init_func()for a in artists:
   a.set_animated(True)

fig.canvas.draw()
bg_cache = fig.canvas.copy_from_bbox(ax.bbox)for f in frames:
    artists = func(f,*fargs)
    update_blit(artists)
    fig.canvas.start_event_loop(interval)

Por supuesto, esto es omitir muchos detalles (como actualizar el fondo cuando se cambia el tamaño de la figura o se vuelve a dibujar por completo). Sin embargo, este ejemplo, con suerte minimalista, da una idea de cómo init_func y func se utilizan dentro de FuncAnimation y la teoría de cómo funciona el “blitting”.

La firma esperada en func y init_func es muy simple de mantener FuncAnimation fuera de su contabilidad y la lógica de la trama, pero esto significa que los objetos invocables que pasa deben saber en qué artistas deberían estar trabajando. Hay varios enfoques para manejar esto, de diversa complejidad y encapsulación. El enfoque más simple, que funciona bastante bien en el caso de un script, es definir al artista en un ámbito global y dejar que Python solucione las cosas. Por ejemplo

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()
xdata, ydata =[],[]
ln,= plt.plot([],[],'ro')definit():
    ax.set_xlim(0,2*np.pi)
    ax.set_ylim(-1,1)return ln,defupdate(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)return ln,

ani = FuncAnimation(fig, update, frames=np.linspace(0,2*np.pi,128),
                    init_func=init, blit=True)
plt.show()

El segundo método es utilizar functools.partial para “obligar” a los artistas a funcionar. Un tercer método consiste en utilizar cierres para desarrollar los artistas y las funciones necesarios. Un cuarto método es crear una clase.

Ejemplos de

ArtistAnimation

Ejemplos de

Clases de escritores

Los escritores proporcionados se dividen en algunas categorías amplias.

El escritor de Pillow se basa en la biblioteca Pillow para escribir la animación, manteniendo todos los datos en la memoria.

PillowWriter

El escritor HTML genera animaciones basadas en JavaScript.

HTMLWriter Redactor de películas HTML basadas en JavaScript.

Los escritores basados ​​en canalizaciones transmiten los fotogramas capturados a través de una canalización a un proceso externo. Las variantes basadas en tuberías tienden a ser más eficaces, pero es posible que no funcionen en todos los sistemas.

FFMpegWriter Escritor de ffmpeg basado en pipe.
ImageMagickWriter Gif animado basado en tubería.
AVConvWriter Escritor avconv basado en pipe.

Los escritores basados ​​en archivos guardan archivos temporales para cada fotograma que se unen en un solo archivo al final. Aunque son más lentos, estos escritores pueden ser más fáciles de depurar.

FFMpegFileWriter Escritor de ffmpeg basado en archivos.
ImageMagickFileWriter Escritor de gif animados basado en archivos.
AVConvFileWriter Escritor avconv basado en archivos.

Fundamentalmente, un MovieWriter proporciona una forma de capturar fotogramas secuenciales del mismo subyacente Figure objeto. La clase base MovieWriter Implementa 3 métodos y un administrador de contexto. La única diferencia entre los escritores basados ​​en canalizaciones y en archivos está en los argumentos de sus respectivos setup métodos.

los setup() El método se utiliza para preparar el escritor (posiblemente abriendo una tubería), sucesivas llamadas a grab_frame() capturar un solo fotograma a la vez y finish() finaliza la película y escribe el archivo de salida en el disco. Por ejemplo

moviewriter = MovieWriter(...)
moviewriter.setup(fig,'my_movie.ext', dpi=100)for j inrange(n):
    update_figure(j)
    moviewriter.grab_frame()
moviewriter.finish()

Si usa las clases de escritor directamente (no a través de Animation.save), se recomienda encarecidamente utilizar el saving administrador de contexto

with moviewriter.saving(fig,'myfile.mp4', dpi=100):for j inrange(n):
        update_figure(j)
        moviewriter.grab_frame()

para garantizar que la configuración y la limpieza se realicen según sea necesario.

Ejemplos de

Clases de ayudantes

Clases base de animación

Animation Una clase base para animaciones.
TimedAnimation Animation subclase para animación basada en el tiempo.

Registro de escritores

Se proporciona un registro de nivel de módulo para mapear entre el nombre del escritor y la clase para permitir que se pase una cadena a Animation.save en lugar de una instancia de escritor.

MovieWriterRegistry Registro de clases de escritor disponibles por nombre legible por humanos.

Clases de base de escritor

Para reducir las clases base de duplicación de código

AbstractMovieWriter Clase base abstracta para escribir películas.
MovieWriter Clase base para escribir películas.
FileMovieWriter MovieWriter para escribir en archivos individuales y coser al final.

y mixins

AVConvBase [Deprecated] Clase Mixin para salida avconv.
FFMpegBase Clase Mixin para salida FFMpeg.
ImageMagickBase Clase Mixin para salida ImageMagick.

están provistos.

Consulte el código fuente para saber cómo implementar fácilmente nuevos MovieWriter clases.

Diagramas de herencia

Diagrama de herencia de matplotlib.animation.FuncAnimation, matplotlib.animation.ArtistAnimation

Diagrama de herencia de matplotlib.animation.AVConvFileWriter, matplotlib.animation.AVConvWriter, matplotlib.animation.FFMpegFileWriter, matplotlib.animation.FFMpegWriter, matplotlib.animation.ImagenMagick.Magick