Introdução
Neste laboratório, aprenderemos como criar um gráfico animado de passeio aleatório 3D usando a biblioteca Matplotlib em Python. Criaremos um gráfico 3D e simularemos um passeio aleatório com 40 partículas que se movem aleatoriamente no espaço 3D.
Dicas para a VM
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ê.
Importar as Bibliotecas Necessárias
Começamos importando as bibliotecas necessárias. Usaremos numpy para gerar números aleatórios e matplotlib para criar o gráfico.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
Definir a Função de Passeio Aleatório
Definimos uma função que gera um passeio aleatório com um determinado número de passos e tamanho máximo do passo. A função recebe duas entradas: num_steps é o número total de passos no passeio aleatório e max_step é o tamanho máximo de cada passo. Usamos numpy.random para gerar números aleatórios para os passos e numpy.cumsum para calcular a soma cumulativa dos passos para obter a posição final.
def random_walk(num_steps, max_step=0.05):
"""Return a 3D random walk as (num_steps, 3) array."""
start_pos = np.random.random(3)
steps = np.random.uniform(-max_step, max_step, size=(num_steps, 3))
walk = start_pos + np.cumsum(steps, axis=0)
return walk
Definir a Função de Atualização
Definimos uma função que atualiza o gráfico para cada quadro da animação. A função recebe três entradas: num é o número do quadro atual, walks é uma lista de todos os passeios aleatórios e lines é uma lista de todas as linhas no gráfico. Para cada linha e passeio, atualizamos os dados para as coordenadas x, y e z da linha até o número do quadro atual. Usamos line.set_data() e line.set_3d_properties() para atualizar as coordenadas x-y e z, respectivamente.
def update_lines(num, walks, lines):
for line, walk in zip(lines, walks):
## NOTE: there is no .set_data() for 3 dim data...
line.set_data(walk[:num, :2].T)
line.set_3d_properties(walk[:num, 2])
return lines
Gerar Passeios Aleatórios
Geramos 40 passeios aleatórios com 30 passos cada, usando a função random_walk() definida anteriormente. Armazenamos todos os passeios aleatórios em uma lista chamada walks.
## Data: 40 random walks as (num_steps, 3) arrays
num_steps = 30
walks = [random_walk(num_steps) for index in range(40)]
Criar Gráfico 3D
Criamos um gráfico 3D usando matplotlib. Adicionamos uma linha vazia para cada passeio aleatório ao gráfico. Definimos os limites para os eixos x, y e z para que fiquem entre 0 e 1.
## Attaching 3D axis to the figure
fig = plt.figure()
ax = fig.add_subplot(projection="3d")
## Create lines initially without data
lines = [ax.plot([], [], [])[0] for _ in walks]
## Setting the axes properties
ax.set(xlim3d=(0, 1), xlabel='X')
ax.set(ylim3d=(0, 1), ylabel='Y')
ax.set(zlim3d=(0, 1), zlabel='Z')
Criar Animação
Criamos uma animação usando a classe FuncAnimation de matplotlib.animation. Passamos o objeto da figura, a função de atualização, o número total de frames (que é igual ao número de passos nos passeios aleatórios), a lista de todos os passeios aleatórios e a lista de todas as linhas como argumentos para o construtor FuncAnimation.
## Creating the Animation object
ani = animation.FuncAnimation(
fig, update_lines, num_steps, fargs=(walks, lines), interval=100)
Exibir Animação
Finalmente, exibimos a animação usando plt.show().
plt.show()
Resumo
Aprendemos como criar um gráfico animado de passeio aleatório 3D usando a biblioteca Matplotlib em Python. Geramos passeios aleatórios e atualizamos o gráfico para cada frame da animação. Esta técnica pode ser usada para visualizar o movimento de partículas, difusão e outros processos estocásticos em espaço 3D.