Matplotlib 3D 图动画

Beginner

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

简介

本实验将指导你如何使用 Matplotlib 创建一个关于所有三个轴旋转的 3D 图的简单动画。我们将使用一个示例数据集来创建一个基本的线框,设置轴标签,并旋转轴。

虚拟机提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作的验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入库和数据集

首先,我们需要导入必要的库和数据集。在这个例子中,我们将使用 matplotlibmpl_toolkits.mplot3d 库来创建 3D 图,并使用 axes3d.get_test_data() 函数生成一个示例数据集。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d

## Generate sample dataset
X, Y, Z = axes3d.get_test_data(0.05)

创建 3D 图

接下来,我们将使用 plt.figure()fig.add_subplot() 函数创建一个 3D 图。我们还将使用 ax.plot_wireframe() 函数将数据集绘制成线框。

## Create 3D plot
fig = plt.figure()
ax = fig.add_subplot(projection='3d')

## Plot wireframe
ax.plot_wireframe(X, Y, Z, rstride=10, cstride=10)

设置轴标签

现在我们将使用 ax.set_xlabel()ax.set_ylabel()ax.set_zlabel() 函数为 3D 图设置轴标签。

## Set axis labels
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

旋转轴并更新绘图

最后,我们将使用一个 for 循环来旋转轴并更新绘图,该循环会遍历仰角、方位角、滚动角以及全方位的完整旋转。我们将使用 ax.view_init() 函数来更新轴视图和标题,并使用 plt.title()plt.draw()plt.pause() 函数来显示动画。

## Rotate the axes and update the plot
for angle in range(0, 360*4 + 1):
    ## Normalize the angle to the range [-180, 180] for display
    angle_norm = (angle + 180) % 360 - 180

    ## Cycle through a full rotation of elevation, then azimuth, roll, and all
    elev = azim = roll = 0
    if angle <= 360:
        elev = angle_norm
    elif angle <= 360*2:
        azim = angle_norm
    elif angle <= 360*3:
        roll = angle_norm
    else:
        elev = azim = roll = angle_norm

    ## Update the axis view and title
    ax.view_init(elev, azim, roll)
    plt.title('Elevation: %d°, Azimuth: %d°, Roll: %d°' % (elev, azim, roll))

    ## Display animation
    plt.draw()
    plt.pause(.001)

总结

在这个实验中,我们学习了如何使用 Matplotlib 创建一个关于所有三个轴旋转的 3D 图的简单动画。我们使用一个示例数据集创建了一个基本的线框,设置了轴标签,并旋转了轴。我们还学习了如何使用 ax.view_init()plt.title()plt.draw()plt.pause() 函数来更新绘图并显示动画。