¿Cómo crear animaciones en Python?

Las animaciones son una excelente manera de hacer que las visualizaciones sean más atractivas y atractivas para el usuario. Nos ayuda a demostrar la visualización de datos de una manera significativa. Python nos ayuda a crear una Visualización de Animación utilizando las potentes bibliotecas de Python existentes. Matplotlib es una biblioteca de visualización de datos muy popular y se usa comúnmente para la representación gráfica de datos y también para animaciones que usan funciones incorporadas. 

Hay dos formas de crear animaciones usando Matplotlib: 

  • Usando la función de pausa()
  • Usando la función FuncAnimation()

Método 1: Usar la función de pausa()

La función pause() en el módulo pyplot de la biblioteca matplotlib se usa para pausar los segundos de intervalo mencionados en el argumento. Considere el siguiente ejemplo en el que crearemos un gráfico lineal simple usando matplotlib y mostraremos Animación en él:

  • Cree 2 arrays, X e Y, y almacene valores del 1 al 100.
  • Trazar X e Y usando la función plot().
  • Agregue la función de pausa() con un intervalo de tiempo adecuado
  • Ejecuta el programa y verás la animación.

Python

from matplotlib import pyplot as plt
  
x = []
y = []
  
for i in range(100):
    x.append(i)
    y.append(i)
  
    # Mention x and y limits to define their range
    plt.xlim(0, 100)
    plt.ylim(0, 100)
      
    # Ploting graph
    plt.plot(x, y, color = 'green')
    plt.pause(0.01)
  
plt.show()

Producción : 

De manera similar, puede usar la función de pausa() para crear animaciones en varios gráficos.

Método 2: Usar la función FuncAnimation()

Esta función FuncAnimation() no crea la animación por sí sola, sino que crea la animación a partir de una serie de gráficos que pasamos.

Sintaxis: FuncAnimation(figure, animation_function, frames=Ninguno, init_func=Ninguno, fargs=Ninguno, save_count=Ninguno, *, cache_frame_data=True, **kwargs)

Ahora hay Múltiples tipos de Animación que puedes hacer usando la función FuncAnimation: 

Animación de gráfico lineal:

En este ejemplo, estamos creando un gráfico lineal simple que mostrará una animación de una línea. De manera similar, usando FuncAnimation, podemos crear muchos tipos de representaciones visuales animadas. Solo necesitamos definir nuestra animación en una función y luego pasarla a FuncAnimation con los parámetros adecuados.

Python

from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np
  
x = []
y = []
  
figure, ax = plt.subplots()
  
# Setting limits for x and y axis
ax.set_xlim(0, 100)
ax.set_ylim(0, 12)
  
# Since plotting a single graph
line,  = ax.plot(0, 0) 
  
def animation_function(i):
    x.append(i * 15)
    y.append(i)
  
    line.set_xdata(x)
    line.set_ydata(y)
    return line,
  
animation = FuncAnimation(figure,
                          func = animation_function,
                          frames = np.arange(0, 10, 0.1), 
                          interval = 10)
plt.show()

    Producción:

Animación de carrera de gráficos de barras en Python

En este ejemplo, estamos creando una animación de gráfico de barras simple que mostrará una animación de cada barra. 

Python

from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation, writers
import numpy as np
  
fig = plt.figure(figsize = (7,5))
axes = fig.add_subplot(1,1,1)
axes.set_ylim(0, 300)
palette = ['blue', 'red', 'green', 
           'darkorange', 'maroon', 'black']
  
y1, y2, y3, y4, y5, y6 = [], [], [], [], [], []
  
def animation_function(i):
    y1 = i
    y2 = 5 * i
    y3 = 3 * i
    y4 = 2 * i
    y5 = 6 * i
    y6 = 3 * i
  
    plt.xlabel("Country")
    plt.ylabel("GDP of Country")
      
    plt.bar(["India", "China", "Germany", 
             "USA", "Canada", "UK"],
            [y1, y2, y3, y4, y5, y6],
            color = palette)
  
plt.title("Bar Chart Animation")
  
animation = FuncAnimation(fig, animation_function, 
                          interval = 50)
plt.show()

Producción:

Animación de diagrama de dispersión en Python:

En este ejemplo, animaremos el diagrama de dispersión en python usando la función aleatoria . Estaremos iterando a través de animation_func y mientras iteramos trazaremos valores aleatorios de los ejes x e y.

Python

from matplotlib import pyplot as plt
from matplotlib.animation import FuncAnimation
import random
import numpy as np
  
x = []
y = []
colors = []
fig = plt.figure(figsize=(7,5))
  
def animation_func(i):
    x.append(random.randint(0,100))
    y.append(random.randint(0,100))
    colors.append(np.random.rand(1))
    area = random.randint(0,30) * random.randint(0,30)
    plt.xlim(0,100)
    plt.ylim(0,100)
    plt.scatter(x, y, c = colors, s = area, alpha = 0.5)
  
animation = FuncAnimation(fig, animation_func, 
                          interval = 100)
plt.show()

Producción:

Movimiento horizontal en carrera de gráfico de barras:

  • Aquí trazaremos una carrera de gráfico de barras utilizando la población más alta en un conjunto de datos de la ciudad.
  • Las diferentes ciudades tendrán una barra diferente y la carrera del gráfico de barras se repetirá desde el año 1990 hasta 2018.
  • Seleccionamos países de los cuales se seleccionarían las ciudades más importantes del conjunto de datos con la población más alta.

El conjunto de datos se puede descargar desde aquí: city_populations

Python

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from matplotlib.animation import FuncAnimation
  
df = pd.read_csv('city_populations.csv',
                 usecols=['name', 'group', 'year', 'value'])
  
colors = dict(zip(['India','Europe','Asia',
                   'Latin America','Middle East',
                   'North America','Africa'],
                    ['#adb0ff', '#ffb3ff', '#90d595',
                     '#e48381', '#aafbff', '#f7bb5f', 
                     '#eafb50']))
  
group_lk = df.set_index('name')['group'].to_dict()
  
def draw_barchart(year):
    dff = df[df['year'].eq(year)].sort_values(by='value',
                                              ascending=True).tail(10)
    ax.clear()
    ax.barh(dff['name'], dff['value'],
            color=[colors[group_lk[x]] for x in dff['name']])
    dx = dff['value'].max() / 200
      
    for i, (value, name) in enumerate(zip(dff['value'],
                                          dff['name'])):
        ax.text(value-dx, i,     name,           
                size=14, weight=600,
                ha='right', va='bottom')
        ax.text(value-dx, i-.25, group_lk[name],
                size=10, color='#444444', 
                ha='right', va='baseline')
        ax.text(value+dx, i,     f'{value:,.0f}', 
                size=14, ha='left',  va='center')
          
    # polished styles
    ax.text(1, 0.4, year, transform=ax.transAxes, 
            color='#777777', size=46, ha='right',
            weight=800)
    ax.text(0, 1.06, 'Population (thousands)',
            transform=ax.transAxes, size=12,
            color='#777777')
      
    ax.xaxis.set_major_formatter(ticker.StrMethodFormatter('{x:,.0f}'))
    ax.xaxis.set_ticks_position('top')
    ax.tick_params(axis='x', colors='#777777', labelsize=12)
    ax.set_yticks([])
    ax.margins(0, 0.01)
    ax.grid(which='major', axis='x', linestyle='-')
    ax.set_axisbelow(True)
    ax.text(0, 1.12, 'The most populous cities in the world from 1500 to 2018',
            transform=ax.transAxes, size=24, weight=600, ha='left')
      
    ax.text(1, 0, 'by @pratapvardhan; credit @jburnmurdoch', 
            transform=ax.transAxes, ha='right', color='#777777', 
            bbox=dict(facecolor='white', alpha=0.8, edgecolor='white'))
    plt.box(False)
    plt.show()
  
fig, ax = plt.subplots(figsize=(15, 8))
animator = FuncAnimation(fig, draw_barchart, 
                         frames = range(1990, 2019))
plt.show()

Producción:

Publicación traducida automáticamente

Artículo escrito por vaibhavpatel1904 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 *