三维盒子表面图

Beginner

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

简介

本实验将指导你使用 Python 和 Matplotlib 创建一个 3D 盒状表面图。我们将定义尺寸、创建虚拟数据并绘制等高面。我们将设置绘图的限制、绘制边缘、设置标签和 z 轴刻度、设置缩放和视角,并添加颜色条。

虚拟机提示

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

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

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

定义尺寸

通过为每条边的长度创建三个变量来定义盒子的尺寸:Nx、Ny 和 Nz。然后使用 numpy 的 arange 方法为 X、Y 和 Z 创建三个网格。最后,为 Z 设置负值以创建一个盒子而不是一个平面。

import matplotlib.pyplot as plt
import numpy as np

## 定义尺寸
Nx, Ny, Nz = 100, 300, 500
X, Y, Z = np.meshgrid(np.arange(Nx), np.arange(Ny), -np.arange(Nz))

创建虚拟数据

通过使用一个公式根据 X、Y 和 Z 的值来计算数据,从而创建用于绘图的虚拟数据。我们将在结果上加 1,以确保最小值大于零。

## 创建虚拟数据
data = (((X+100)**2 + (Y-20)**2 + 2*Z)/1000+1)

绘制等高面

使用 contourf 方法为盒子的每个表面绘制等高面。为 zdiroffset 使用适当的参数。

kw = {
    'vmin': data.min(),
    'vmax': data.max(),
    'levels': np.linspace(data.min(), data.max(), 10),
}

## 创建一个带有 3D 轴的图形
fig = plt.figure(figsize=(5, 4))
ax = fig.add_subplot(111, projection='3d')

## 绘制等高面
_ = ax.contourf(
    X[:, :, 0], Y[:, :, 0], data[:, :, 0],
    zdir='z', offset=0, **kw
)
_ = ax.contourf(
    X[0, :, :], data[0, :, :], Z[0, :, :],
    zdir='y', offset=0, **kw
)
C = ax.contourf(
    data[:, -1, :], Y[:, -1, :], Z[:, -1, :],
    zdir='x', offset=X.max(), **kw
)

设置绘图范围

使用 set 方法并传入 X、Y 和 Z 坐标的范围来设置绘图范围。

## 根据坐标范围设置绘图范围
xmin, xmax = X.min(), X.max()
ymin, ymax = Y.min(), Y.max()
zmin, zmax = Z.min(), Z.max()
ax.set(xlim=[xmin, xmax], ylim=[ymin, ymax], zlim=[zmin, zmax])

绘制边缘

使用 plot 方法绘制边缘。我们将沿着 X 和 Y 坐标绘制三条线,以及沿着 X 和 Z 坐标绘制一条线。

## 绘制边缘
edges_kw = dict(color='0.4', linewidth=1, zorder=1e3)
ax.plot([xmax, xmax], [ymin, ymax], 0, **edges_kw)
ax.plot([xmin, xmax], [ymin, ymin], 0, **edges_kw)
ax.plot([xmax, xmax], [ymin, ymin], [zmin, zmax], **edges_kw)

设置标签和 Z 轴刻度

使用 set 方法设置标签和 Z 轴刻度。我们将设置 X、Y 和 Z 坐标的标签,并设置 Z 轴刻度以显示盒子的深度。

## 设置标签和 Z 轴刻度
ax.set(
    xlabel='X [km]',
    ylabel='Y [km]',
    zlabel='Z [m]',
    zticks=[0, -150, -300, -450],
)

设置缩放比例和视角

使用 view_initset_box_aspect 方法设置缩放比例和视角。我们将把视角设置为在 X 方向上 40 度,在 Y 方向上 -30 度,并且将缩放比例设置为 0.9。

## 设置缩放比例和视角
ax.view_init(40, -30, 0)
ax.set_box_aspect(None, zoom=0.9)

添加颜色条

使用 colorbar 方法添加颜色条。我们将设置 fractionpad 参数来调整颜色条的位置,并设置标签以显示数据的名称和单位。

## 颜色条
fig.colorbar(C, ax=ax, fraction=0.02, pad=0.1, label='Name [units]')

总结

在这个实验中,我们使用 Python 和 Matplotlib 创建了一个三维盒子表面图。我们定义了尺寸,创建了虚拟数据,并绘制了等高面。我们设置了绘图的边界,绘制了边缘,设置了标签和 z 轴刻度,设置了缩放比例和视角,并添加了一个颜色条。这个图可用于可视化三维数据并探索变量之间的关系。