如何在Matplotlib中对3D曲面按指定高度截取并绘制填充区域?
在Matplotlib 3D曲面指定高度截取填充切片的实现方法
要在z=4处截取曲面的填充切片,核心思路是先通过等值线插值获取该高度对应的(x,y)边界,再将这些边界在z=4平面上填充为闭合区域。具体实现步骤如下:
完整代码示例
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.collections import Poly3DCollection # 生成原曲面数据 x = np.linspace(-5, 5, 100) # 增加采样点让等值线更平滑 y = np.linspace(-5, 5, 100) X, Y = np.meshgrid(x, y) Z = 3*(1-X)**2*np.exp(-(X**2) - (Y+1)**2) - 10*(X/5 - X**3 - Y**5)*np.exp(-X**2-Y**2) - 1/3*np.exp(-(X+1)**2 - Y**2) # 创建3D绘图对象 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') # 绘制原3D曲面 plot1 = ax.plot_surface(X, Y, Z, cmap='jet', alpha=0.7) # -------------------------- 关键:提取z=4的等值线并填充 -------------------------- # 计算z=4对应的等值线,levels参数指定要提取的高度值 contour = ax.contour(X, Y, Z, levels=[4], colors='black', linewidths=1) # 提取等值线的路径数据 paths = contour.collections[0].get_paths() # 准备3D填充区域的顶点数据 poly3d = [] for path in paths: # 获取路径的(x,y)坐标,转换为数组 verts = path.vertices # 将每个点的z坐标设为4,组成3D坐标数组 zs = np.full(len(verts), 4) poly = np.column_stack((verts[:, 0], verts[:, 1], zs)) poly3d.append(poly) # 创建3D多边形集合并添加到坐标轴 poly_collection = Poly3DCollection(poly3d, facecolors='gold', alpha=0.8) ax.add_collection3d(poly_collection) # 设置坐标轴标签 ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') # 调整视角,让填充区域更清晰 ax.view_init(elev=30, azim=-60) # 添加颜色条 fig.colorbar(plot1, shrink=0.5, aspect=5) plt.show()
关键步骤解释
- 提升采样密度:将
linspace的采样点从默认的50增加到100,让等值线的边界更平滑,避免出现锯齿。 - 提取等值线:使用
ax.contour函数,通过levels=[4]指定提取z=4处的等值线,该函数会自动通过插值计算离散网格间的等值线位置,正好解决你提到的插值需求。 - 转换为3D填充区域:从等值线集合中提取路径数据,为每个路径点添加固定z=4的坐标,将2D路径转换为3D多边形顶点,再用
Poly3DCollection实现填充。 - 视觉优化:设置原曲面的透明度(
alpha=0.7),让填充区域和原曲面的层次更分明,同时调整视角确保填充区域可见。
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

