Введение
В этом лабораторном занятии мы научимся создавать анимированный трехмерный график случайного блуждания с использованием библиотеки Matplotlib в Python. Мы создадим трехмерный график и моделируем случайное блуждание 40 частиц, которые движутся случайным образом в трехмерном пространстве.
Советы по работе с ВМ
После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике с Jupyter Notebook.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Импортируем необходимые библиотеки
Начнем с импорта необходимых библиотек. Мы будем использовать numpy для генерации случайных чисел и matplotlib для создания графика.
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.animation as animation
Определяем функцию случайного блуждания
Определяем функцию, которая генерирует случайное блуждание с заданным количеством шагов и максимальным размером шага. Функция принимает два входных параметра: num_steps - общее количество шагов в случайном блуждании, и max_step - максимальный размер каждого шага. Мы используем numpy.random для генерации случайных чисел для шагов и numpy.cumsum для вычисления накопленной суммы шагов, чтобы получить конечную позицию.
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
Определяем функцию обновления
Определяем функцию, которая обновляет график для каждого кадра анимации. Функция принимает три входных параметра: num - номер текущего кадра, walks - список всех случайных блужданий, и lines - список всех линий на графике. Для каждой линии и случайного блуждания мы обновляем данные по координатам x, y и z линии до текущего номера кадра. Мы используем line.set_data() и line.set_3d_properties() для обновления координат x-y и z соответственно.
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
Генерируем случайные блуждания
Мы генерируем 40 случайных блужданий по 30 шагов каждый с использованием функции random_walk(), определенной ранее. Все случайные блуждания храним в списке под названием walks.
## Data: 40 random walks as (num_steps, 3) arrays
num_steps = 30
walks = [random_walk(num_steps) for index in range(40)]
Создаем трехмерный график
Мы создаем трехмерный график с использованием matplotlib. К графику добавляем пустую линию для каждого случайного блуждания. Задаем пределы для осей x, y и z в диапазоне от 0 до 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')
Создаем анимацию
Мы создаем анимацию с использованием класса FuncAnimation из matplotlib.animation. В качестве аргументов конструктора FuncAnimation передаем объект фигуры, функцию обновления, общее количество кадров (которое равно количеству шагов в случайных блужданиях), список всех случайных блужданий и список всех линий.
## Creating the Animation object
ani = animation.FuncAnimation(
fig, update_lines, num_steps, fargs=(walks, lines), interval=100)
Показываем анимацию
Наконец, мы показываем анимацию с использованием plt.show().
plt.show()
Резюме
Мы научились создавать анимированный трехмерный график случайного блуждания с использованием библиотеки Matplotlib в Python. Мы генерировали случайные блуждания и обновляли график для каждого кадра анимации. Эта техника может быть использована для визуализации движения частиц, диффузии и других стохастических процессов в трехмерном пространстве.