Nuestro grupo de trabajo ha estado horas investigando soluciones a tu duda, te dejamos la resolución por eso nuestro deseo es serte de gran ayuda.
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
- Decaer
- La actualización de Bayes
- El problema del doble péndulo
- Histograma animado
- Simulación de lluvia
- Paseo aleatorio animado en 3D
- Gráfico de línea animado
- Osciloscopio
- MATPLOTLIB SIN CADENAS
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
Te mostramos reseñas y valoraciones
No se te olvide mostrar esta división si te fue útil.