Uso de Matplotlib para animaciones

La biblioteca Matplotlib de Python es una herramienta de trazado utilizada para trazar gráficos de funciones o figuras. También se puede utilizar como herramienta de animación. Los gráficos trazados, cuando se agregan con animaciones, brindan una visualización más poderosa y ayudan al presentador a captar una mayor cantidad de audiencia. Matplotlib también puede conectarse fácilmente con Pandas para crear animaciones aún más sofisticadas.

Las animaciones en Matplotlib se pueden hacer usando la Animationclase de dos maneras:

  • Al llamar a una función una y otra vez: utiliza una función predefinida que, cuando se ejecuta una y otra vez, crea una animación.
  • Mediante el uso de objetos fijos: algunos objetos artísticos animados cuando se combinan con otros producen una escena de animación.

Es importante tener en cuenta que debemos mantener en todos los puntos una referencia al objeto animado o, de lo contrario, la animación se detendrá. Esto se debe a que Animation classcontiene una sola referencia de puntero al objeto de animación y, a medida que avanza el tiempo para ejecutar la animación, esta referencia de puntero debe mantenerse; de ​​lo contrario, se recopilará como un valor no utilizado.

Aunque hay dos formas, la primera es más común y conveniente y aquí, solo usaremos esa. Sin embargo, también puede leer la documentación del otro aquí .

Sumerjámonos en las animaciones de Matplotlib.

Instalaciones requeridas:

1. Numpyy Matplotlib
2.ffmpeg

Descargue ffmpeg para Python desde aquí .

Veamos un ejemplo. Aquí intentaremos hacer una onda sinusoidal continua usando animaciones y herramientas de trazado. Haremos uso de numpyy pyplotde matplotlibpara esto. Como ya se dijo, usaremos el método de función en lugar de los objetos artísticos.

Nota: Para guardar una animación en su computadora, use anim.save(filename)o Animation.to_html5_video.

from matplotlib import pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation 
   
# initializing a figure in 
# which the graph will be plotted
fig = plt.figure() 
   
# marking the x-axis and y-axis
axis = plt.axes(xlim =(0, 4), 
                ylim =(-2, 2)) 
  
# initializing a line variable
line, = axis.plot([], [], lw = 3) 
   
# data which the line will 
# contain (x, y)
def init(): 
    line.set_data([], [])
    return line,
   
def animate(i):
    x = np.linspace(0, 4, 1000)
   
    # plots a sine graph
    y = np.sin(2 * np.pi * (x - 0.01 * i))
    line.set_data(x, y)
      
    return line,
   
anim = FuncAnimation(fig, animate, init_func = init,
                     frames = 200, interval = 20, blit = True)
  
   
anim.save('continuousSineWave.mp4', 
          writer = 'ffmpeg', fps = 30)

Al principio, después de importar las necesidades, configuramos una figura en blanco o una ventana en blanco en la que se dibujará toda la animación. A continuación, inicializamos una variable lineque contendrá las coordenadas x e y del gráfico. Estos se mantienen vacíos al principio, ya que los datos en él seguirán cambiando continuamente debido a la animación. Finalmente, establecemos la función de animación animate(i)que toma un argumento i , donde i se llama el número de cuadro y usando esto creamos la onda sinusoidal (o cualquier otra figura) que variará continuamente dependiendo del valor de i . En la última línea anim = FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=True)usamos la FuncAnimationfunción para crear una animación que mostrará 200 fotogramas por segundo y en un intervalo de 20 microsegundos.

Producción :

Esa es una visualización muy poderosa. Una cosa a tener en cuenta es que cuando vemos nuestro gif guardado, será un clip continuo a diferencia del video en nuestra salida que finaliza en unos segundos. Veamos un ejemplo más. Intenta adivinar la salida a medida que codificamos el programa, ya que aclarará nuestro concepto.

import matplotlib.animation as animation 
import matplotlib.pyplot as plt 
import numpy as np 
  
   
# creating a blank window
# for the animation 
fig = plt.figure() 
axis = plt.axes(xlim =(-50, 50),
                ylim =(-50, 50)) 
  
line, = axis.plot([], [], lw = 2) 
   
# what will our line dataset
# contain?
def init(): 
    line.set_data([], []) 
    return line, 
   
# initializing empty values
# for x and y co-ordinates
xdata, ydata = [], [] 
   
# animation function 
def animate(i): 
    # t is a parameter which varies
    # with the frame number
    t = 0.1 * i 
       
    # x, y values to be plotted 
    x = t * np.sin(t) 
    y = t * np.cos(t) 
       
    # appending values to the previously 
    # empty x and y data holders 
    xdata.append(x) 
    ydata.append(y) 
    line.set_data(xdata, ydata) 
      
    return line,
   
# calling the animation function     
anim = animation.FuncAnimation(fig, animate, init_func = init, 
                               frames = 500, interval = 20, blit = True) 
   
# saves the animation in our desktop
anim.save('growingCoil.mp4', writer = 'ffmpeg', fps = 30)

Como ya podríamos haber adivinado y tan obvio como sugiere el nombre del archivo guardado, es una animación de una bobina en continuo crecimiento. Al igual que antes, primero importamos todos los módulos. Pero esta vez, importamos la matplotlib.animationbiblioteca por completo .

import matplotlib.animation as animation

sin embargo, en el ejemplo anterior, importamos solo la FuncAnimationfunción de él

from matplotlib.animation import FuncAnimation

Sin embargo, esto realmente no hace ningún cambio y uno puede elegir cualquier forma de importación. Luego creamos una figura en la que se colocará la animación. La animatefunción varía con el número de fotograma i . Una cosa que debe saber es que una bobina no es más que una función compuesta de seno y coseno. Tomamos la función seno en el eje x y el coseno en el eje y y la figura resultante da una bobina.

Producción:

Por lo tanto, concluimos que se pueden hacer muchas animaciones interesantes utilizando algunos conocimientos básicos de matplotlib. Esto realmente es útil cuando se necesita presentar algunas visualizaciones con poder de animación adicional sin usar herramientas de animación de nivel superior como Blender.

Publicación traducida automáticamente

Artículo escrito por agarwalkeshav8399 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *