Skip to content

三维绘图

虽然 Matplotlib 最初主要用于 2D 绘图,但 mpl_toolkits.mplot3d 工具包扩展了它的能力,使其能够创建各种类型的三维可视化图形。这个工具包通常包含在标准的 Matplotlib 安装中,所以通常无需单独安装。

要启用 3D 绘图,你需要创建一个特殊的 3D Axes 对象(三维坐标轴对象)。这通常通过在创建 Axes(通常使用 plt.figure().add_subplot() 或 plt.axes())时传递 projection='3d' 关键字参数来完成。

import matplotlib.pyplot as plt
import numpy as np
# 如果使用 projection='3d',严格来说不需要显式导入 mplot3d
# 但导入也不会有什么问题:
# from mpl_toolkits import mplot3d
# --- 创建一个 Figure 和一个 3D Axes 对象 ---
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1, 1, 1, projection='3d')
# 其他方式:
# ax = plt.axes(projection='3d')
# fig, ax = plt.subplots(subplot_kw={'projection': '3d'})
# 现在 'ax' 是一个 3D Axes 对象,可以用于 3D 绘图命令了。

拥有一个 3D Axes 对象 (ax) 后,你就可以使用其特定的方法来创建各种 3D 图形了。

最简单的 3D 图形是用线条连接由 (x, y, z) 坐标定义的点。

# 用于绘制 3D 螺旋线的数据示例
z_line = np.linspace(0, 15, 1000)
x_line = np.sin(z_line)
y_line = np.cos(z_line)
# 绘制 3D 折线图
ax.plot3D(x_line, y_line, z_line, color='gray', label='Helix')
ax.set_title('3D Line Plot Example')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.legend()

在指定的 (x, y, z) 坐标处绘制单独的标记。适用于在三维空间中可视化点云或离散数据点。你可以根据其他变量改变标记大小 (s) 和颜色 (c)。

# 用于绘制 3D 散点图的数据示例
np.random.seed(42)
z_scatter = 15 * np.random.random(100)
x_scatter = np.sin(z_scatter) + 0.1 * np.random.randn(100)
y_scatter = np.cos(z_scatter) + 0.1 * np.random.randn(100)
# 根据 Z 值给点上色(可选)
colors = z_scatter
# 绘制 3D 散点图
sc = ax.scatter3D(x_scatter, y_scatter, z_scatter, c=colors, cmap='viridis', s=50, alpha=0.7, label='Random Points')
ax.set_title('3D Scatter Plot Example')
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 如果根据值上色,添加颜色条
cbar = fig.colorbar(sc, label='Z value', shrink=0.5, aspect=10)
ax.legend()

本简介涵盖了如何创建 3D axes 以及基本的折线图和散点图。其他常见的 3D 绘图类型包括:

  • 等高线图 (ax.contour3D):在 3D 空间中绘制等高线。
  • 线框图 (ax.plot_wireframe):使用线条网格表示曲面。
  • 曲面图 (ax.plot_surface):使用填充的多边形表示曲面,通常按高度着色。

这些更复杂的图形通常需要数据以 2D 网格的形式组织(使用 np.meshgrid)。我们将在后续章节中探讨这些内容。

# 完成并显示包含两个示例的图形(如果一起运行)
plt.show() # 显示 Figure