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

如何为3D surface plot添加特定高度的section plane实现剖切效果?

3D曲面图添加剖切平面的解决方法

你的问题核心是:基础3D绘图库默认只做图层叠加,不支持原生的几何剖切,所以平面只会浮在曲面前后,不会截断显示。下面针对常用绘图库给出具体解决方案:

Matplotlib 场景

Matplotlib的3D渲染不支持真正的布尔剖切,需要手动裁剪曲面数据来模拟效果:

  • 思路:把曲面中高于阈值的点设为NaN(Matplotlib会跳过这些点的渲染),再叠加剖切平面,视觉上就像被切开了。
  • 示例代码:
import numpy as np
import matplotlib.pyplot as plt

# 生成模拟时间序列数据(x=月份,y=年份,z=数值)
x = np.linspace(0, 12, 100)
y = np.linspace(2010, 2020, 20)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)

# 设置剖切阈值
threshold = 0.5

# 裁剪曲面:仅保留低于阈值的部分
Z_clipped = np.where(Z <= threshold, Z, np.nan)

# 绘图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 绘制裁剪后的曲面
ax.plot_surface(X, Y, Z_clipped, cmap='viridis')

# 绘制剖切平面(z=threshold,覆盖整个x-y范围)
xx, yy = np.meshgrid(x, y)
zz = np.full_like(xx, threshold)
ax.plot_surface(xx, yy, zz, color='red', alpha=0.3)

plt.show()

Plotly 场景

Plotly支持更便捷的剖切实现,两种方式可选:

方式1:截断曲面+叠加平面

用zmax参数直接截断高于阈值的曲面部分,再添加平面:

import plotly.graph_objects as go
import numpy as np

x = np.linspace(0, 12, 100)
y = np.linspace(2010, 2020, 20)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)
threshold = 0.5

fig = go.Figure()

# 绘制截断后的曲面(仅显示<=阈值的部分)
fig.add_trace(go.Surface(
    x=X, y=Y, z=Z,
    cmap='viridis',
    zmax=threshold
))

# 添加剖切平面
fig.add_trace(go.Surface(
    x=X, y=Y, z=np.full_like(Z, threshold),
    colorscale=[[0, 'red'], [1, 'red']],
    opacity=0.3,
    showscale=False
))

fig.update_layout(scene=dict(
    xaxis_title='月份', yaxis_title='年份', zaxis_title='数值'
))
fig.show()

方式2:原生剖切功能

直接用Plotly的slice参数添加剖切平面,自动截断曲面:

import plotly.graph_objects as go
import numpy as np

x = np.linspace(0, 12, 100)
y = np.linspace(2010, 2020, 20)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)
threshold = 0.5

fig = go.Figure(data=[go.Surface(x=X, y=Y, z=Z)])

fig.update_layout(
    scene=dict(
        xaxis_title='月份', yaxis_title='年份', zaxis_title='数值',
        # 添加z方向剖切平面,位置为threshold
        zaxis=dict(slice=dict(show=True, thickness=0.1, location=threshold))
    )
)
fig.show()

Mayavi 场景(真正的几何剖切)

如果需要专业的3D剖切效果,Mayavi支持原生的几何布尔运算,会真正隐藏平面另一侧的曲面:

from mayavi import mlab
import numpy as np

x = np.linspace(0, 12, 100)
y = np.linspace(2010, 2020, 20)
X, Y = np.meshgrid(x, y)
Z = np.sin(X) + np.cos(Y)
threshold = 0.5

# 创建曲面
surf = mlab.surf(X, Y, Z, colormap='viridis')

# 添加剖切平面(z轴方向,位置为threshold)
plane = mlab.pipeline.scalar_cut_plane(surf, plane_orientation='z_axes',
                                      slice_position=threshold)
plane.implicit_plane.opacity = 0.3
plane.implicit_plane.color = (1, 0, 0)

mlab.show()

关键注意点

  • 调整alpha和相机仰角没用的原因:这些只是调整图层透明度和视角,没有改变曲面的渲染范围,本质是库没有对曲面做截断处理。
  • 如果你用的是其他库(比如PyVista),核心思路类似:要么手动裁剪数据,要么使用库提供的原生剖切工具。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 06:20:27