Skip to content

Matplotlib - 三维曲面图

Matplotlib - 3D 曲面图 (3D Surface Plot)

Section titled “Matplotlib - 3D 曲面图 (3D Surface Plot)”

3D 曲面图用于可视化表示函数 Z = f(X, Y) 的三维曲面。它类似于线框图 (wireframe plot),但除了线条之外,由 X、Y 和 Z 坐标定义的网格面填充了彩色多边形。颜色通常代表曲面的高度 (Z 值),有助于感知曲面的拓扑 (topology)。

与 Matplotlib 中的其他 3D 图一样,曲面图需要一个使用 projection='3d' 关键字创建的 3D Axes 对象。数据 X、Y 和 Z 通常必须是表示网格上坐标的二维数组(通常使用 numpy.meshgrid 创建)。

ax.plot_surface() 方法用于创建这些图。

ax.plot_surface(X, Y, Z, **kwargs)
  • X, Y, Z: 二维数组 (2D arrays),表示曲面网格点的 x、y 和 z 坐标。
  • cmap: 字符串 (String) 或 Colormap 实例。指定用于根据 Z 值对曲面着色的颜色映射表(例如,‘viridis’、‘plasma’、‘coolwarm’)。
  • color: 如果希望整个曲面为单一颜色,则指定单一颜色(会覆盖 cmap)。
  • edgecolor: 曲面补丁边缘的颜色(设置为 'none' 有时可以产生更平滑的外观)。
  • linewidth: 边缘线的宽度。
  • rstride, cstride: 整数 (Integers)。行和列的下采样步长。对于大型曲面,仅绘制第 n 条网格线可以加快渲染速度。
  • alpha: 浮点数 (Float) (0-1)。曲面的透明度。

示例:绘制 Z = cos(sqrt(X^2 + Y^2)) 的 3D 曲面图。

import matplotlib.pyplot as plt
import numpy as np
# 1. 创建坐标向量和网格
x_vec = np.linspace(-5, 5, 50)
y_vec = np.linspace(-5, 5, 50)
X, Y = np.meshgrid(x_vec, y_vec)
# 2. 根据函数计算 Z 值
R = np.sqrt(X**2 + Y**2)
Z = np.cos(R)
# 3. 创建图和 3D 轴
fig = plt.figure(figsize=(9, 7))
ax = plt.axes(projection='3d')
# 4. 创建曲面图
# 使用颜色映射表 (cmap) 根据 Z 高度着色
surface_plot = ax.plot_surface(X, Y, Z,
cmap='viridis', # 着色用的 Colormap
edgecolor='black', # 网格线的颜色
linewidth=0.2, # 网格线的宽度
alpha=0.9 # 曲面透明度
)
# 可选地,移除边缘以获得更平滑的外观:
# surface_plot = ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='none')
# 5. 添加颜色条以映射颜色到 Z 值
fig.colorbar(surface_plot, shrink=0.5, aspect=10, label='Z 值 (cos(R))')
# 6. 设置标签和标题
ax.set_xlabel('X 轴')
ax.set_ylabel('Y 轴')
ax.set_zlabel('Z 轴')
ax.set_title('3D 曲面图示例')
# 如有必要,设置 Z 限制(例如,聚焦到某个范围)
# ax.set_zlim(-1.0, 1.0)
# 调整视角 (可选)
ax.view_init(elev=30, azim=45) # elev=仰角, azim=方位角
plt.show()

此代码为函数生成 X、Y 和 Z 坐标网格,然后使用 ax.plot_surface() 渲染 3D 曲面。cmap='viridis' 参数根据 Z 值对曲面进行着色,并添加了一个颜色条 (colorbar) 以提供键。调整 edgecolor、linewidth、alpha 和视角 (ax.view_init) 等参数可以显著自定义图的外观。