You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()

关键步骤解释

  1. 提升采样密度:将linspace的采样点从默认的50增加到100,让等值线的边界更平滑,避免出现锯齿。
  2. 提取等值线:使用ax.contour函数,通过levels=[4]指定提取z=4处的等值线,该函数会自动通过插值计算离散网格间的等值线位置,正好解决你提到的插值需求。
  3. 转换为3D填充区域:从等值线集合中提取路径数据,为每个路径点添加固定z=4的坐标,将2D路径转换为3D多边形顶点,再用Poly3DCollection实现填充。
  4. 视觉优化:设置原曲面的透明度(alpha=0.7),让填充区域和原曲面的层次更分明,同时调整视角确保填充区域可见。

内容的提问来源于stack exchange,提问作者sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:01:14