使用 Matplotlib 的三维随机游走动画

Beginner

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

简介

在本实验中,我们将学习如何使用 Python 中的 Matplotlib 库创建一个动画 3D 随机游走图。我们将创建一个 3D 图,并模拟 40 个粒子在 3D 空间中随机移动的随机游走。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 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):
        ## 注意:对于三维数据没有.set_data() 方法...
        line.set_data(walk[:num, :2].T)
        line.set_3d_properties(walk[:num, 2])
    return lines

生成随机游走

我们使用之前定义的 random_walk() 函数生成 40 个随机游走,每个随机游走有 30 步。我们将所有的随机游走存储在一个名为 walks 的列表中。

## 数据:40 个随机游走,形式为 (num_steps, 3) 数组
num_steps = 30
walks = [random_walk(num_steps) for index in range(40)]

创建三维绘图

我们使用 matplotlib 创建一个三维绘图。我们为每个随机游走在绘图中添加一条空线条。我们将 x、y 和 z 轴的范围设置在 0 到 1 之间。

## 将三维轴附加到图形
fig = plt.figure()
ax = fig.add_subplot(projection="3d")

## 最初创建没有数据的线条
lines = [ax.plot([], [], [])[0] for _ in walks]

## 设置轴属性
ax.set(xlim3d=(0, 1), xlabel='X')
ax.set(ylim3d=(0, 1), ylabel='Y')
ax.set(zlim3d=(0, 1), zlabel='Z')

创建动画

我们使用 matplotlib.animation 中的 FuncAnimation 类创建一个动画。我们将图形对象、更新函数、总帧数(等于随机游走中的步数)、所有随机游走的列表以及所有线条的列表作为参数传递给 FuncAnimation 构造函数。

## 创建动画对象
ani = animation.FuncAnimation(
    fig, update_lines, num_steps, fargs=(walks, lines), interval=100)

显示动画

最后,我们使用 plt.show() 来显示动画。

plt.show()

总结

我们已经学习了如何使用 Python 中的 Matplotlib 库创建一个动态的三维随机游走图。我们生成了随机游走,并为动画的每一帧更新了图形。这种技术可用于可视化三维空间中的粒子运动、扩散和其他随机过程。