Simulação de Chuva com Matplotlib

Beginner

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

Introdução

Este laboratório é um tutorial passo a passo sobre como criar uma simulação de chuva usando a biblioteca Matplotlib do Python. A simulação irá animar a escala e a opacidade de 50 pontos de dispersão para simular gotas de chuva caindo em uma superfície.

Dicas para a VM (Máquina Virtual)

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Criar uma nova Figura e Eixos (Axes)

O primeiro passo é criar uma nova figura e eixos (axes) que a preencham. Esta será a tela na qual a simulação será desenhada.

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([])

Criar Dados de Chuva

Em seguida, criaremos os dados da chuva. Criaremos 50 gotas de chuva em posições aleatórias, com taxas de crescimento aleatórias e cores aleatórias.

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 o Gráfico de Dispersão (Scatter Plot)

Agora, construiremos o gráfico de dispersão (scatter plot), que atualizaremos durante a animação à medida que as gotas de chuva se desenvolvem.

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

Criar a Função de Atualização

A função de atualização (update function) será chamada pelo objeto FuncAnimation para atualizar o gráfico de dispersão (scatter plot) durante a animação.

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'])

Criar a Animação

Finalmente, criaremos a animação usando o objeto FuncAnimation, passando a figura, a função de atualização (update function), o intervalo entre os frames em milissegundos e o número de frames a serem salvos.

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

Resumo

Neste laboratório (lab), aprendemos como criar uma simulação de chuva usando a biblioteca Matplotlib do Python. Criamos uma nova Figura (Figure) e Eixos (Axes), criamos os dados da chuva, construímos o gráfico de dispersão (scatter plot), criamos a função de atualização (update function) e criamos a animação usando o objeto FuncAnimation.