Simulación de lluvia con Matplotlib

PythonPythonBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica es un tutorial paso a paso sobre cómo crear una simulación de lluvia utilizando la biblioteca Matplotlib de Python. La simulación animará la escala y la opacidad de 50 puntos de dispersión para simular gotas de lluvia cayendo sobre una superficie.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje su retroalimentación después de la sesión y lo resolveremos rápidamente para usted.

Crear una nueva Figura y Ejes

El primer paso es crear una nueva figura y un eje que la llene. Esta será la superficie en la que se dibujará la simulación.

fig = plt.figure(figsize=(7, 7))
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.set_xlim(0, 1), ax.set_xticks([])
ax.set_ylim(0, 1), ax.set_yticks([])

Crear datos de lluvia

A continuación, crearemos los datos de lluvia. Crearemos 50 gotas de lluvia en posiciones aleatorias, con tasas de crecimiento aleatorias y colores aleatorios.

n_drops = 50
rain_drops = np.zeros(n_drops, dtype=[('position', float, (2,)),
                                      ('size',     float),
                                      ('growth',   float),
                                      ('color',    float, (4,))])

rain_drops['position'] = np.random.uniform(0, 1, (n_drops, 2))
rain_drops['growth'] = np.random.uniform(50, 200, n_drops)

Construir el diagrama de dispersión

Ahora, construiremos el diagrama de dispersión que actualizaremos durante la animación a medida que las gotas de lluvia evolucionen.

scat = ax.scatter(rain_drops['position'][:, 0], rain_drops['position'][:, 1],
                  s=rain_drops['size'], lw=0.5, edgecolors=rain_drops['color'],
                  facecolors='none')

Crear la función de actualización

La función de actualización será llamada por el objeto FuncAnimation para actualizar el diagrama de dispersión durante la animación.

def update(frame_number):
    ## Get an index which we can use to re-spawn the oldest raindrop.
    current_index = frame_number % n_drops

    ## Make all colors more transparent as time progresses.
    rain_drops['color'][:, 3] -= 1.0/len(rain_drops)
    rain_drops['color'][:, 3] = np.clip(rain_drops['color'][:, 3], 0, 1)

    ## Make all circles bigger.
    rain_drops['size'] += rain_drops['growth']

    ## Pick a new position for oldest rain drop, resetting its size,
    ## color and growth factor.
    rain_drops['position'][current_index] = np.random.uniform(0, 1, 2)
    rain_drops['size'][current_index] = 5
    rain_drops['color'][current_index] = (0, 0, 0, 1)
    rain_drops['growth'][current_index] = np.random.uniform(50, 200)

    ## Update the scatter collection, with the new colors, sizes and positions.
    scat.set_edgecolors(rain_drops['color'])
    scat.set_sizes(rain_drops['size'])
    scat.set_offsets(rain_drops['position'])

Crear la animación

Finalmente, crearemos la animación utilizando el objeto FuncAnimation, pasando la figura, la función de actualización, el intervalo entre cuadros en milisegundos y el número de cuadros a guardar.

animation = FuncAnimation(fig, update, interval=10, save_count=100)
plt.show()

Resumen

En este laboratorio, aprendimos cómo crear una simulación de lluvia utilizando la biblioteca Matplotlib de Python. Creamos una nueva Figura y Ejes, creamos los datos de lluvia, construimos el diagrama de dispersión, creamos la función de actualización y creamos la animación utilizando el objeto FuncAnimation.