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

如何基于离散x、y、z数据绘制3D曲面图?

如何用离散x/y/z数据绘制3D曲面图?

我查了大量用mesh-grid绘制3D曲面图的资料,但还是没解决问题。大多数示例都是通过方程为每个网格点生成Z分量,比如这段代码:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.mlab as mlab
import numpy as np

def P(X, Y):
    return mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)      

fig = plt.figure()
ax = fig.gca(projection = '3d')
jet = plt.get_cmap('jet')

x = np.linspace(-2, 2, 60)
y = np.linspace(-2, 2, 60)
X, Y = np.meshgrid(x, y)
Z = P(X, Y)
surf = ax.plot_surface(X, Y, Z, rstride = 1, cstride = 1, cmap = jet, linewidth = 0)
ax.set_zlim3d(0, Z.max())

plt.show()

但我的情况是已经有等维度的x、y、z离散数据,却不知道怎么获取创建网格所需的二维Z参数。以下是我的示例数据集、尝试代码,以及期望的输出图:

我的数据集与尝试代码

# 随机3D数据集
s = np.random.uniform(-1,1,100)
t = np.random.uniform(-1,1,100)
z= np.random.uniform(100,500,100)
# 生成网格
x = np.linspace(-1,1,21)
y = np.linspace(-1,1,21)
X, Y = np.meshgrid(x,y)
surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm,
                       linewidth=0, antialiased=False)

期望输出图

平滑的3D曲面图


解决方案

要从离散点生成可用于plot_surface的二维Z矩阵,核心是对离散数据进行插值,将散点映射到规则网格上。这里可以用scipy.interpolate.griddata实现,步骤如下:

  1. 导入scipy的插值模块
  2. 用griddata将离散的(s,t,z)插值到规则网格(X,Y)上,得到二维Z矩阵
  3. 用生成的X、Y、Z绘制曲面图

完整代码示例:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.interpolate import griddata

# 随机3D离散数据集
s = np.random.uniform(-1, 1, 100)
t = np.random.uniform(-1, 1, 100)
z = np.random.uniform(100, 500, 100)

# 创建规则网格
x = np.linspace(-1, 1, 21)
y = np.linspace(-1, 1, 21)
X, Y = np.meshgrid(x, y)

# 插值得到二维Z矩阵,method可选'linear'/'cubic'/'nearest'
Z = griddata((s, t), z, (X, Y), method='cubic')

# 绘制3D曲面图
fig = plt.figure()
ax = fig.add_subplot(projection='3d')
surf = ax.plot_surface(X, Y, Z, cmap='coolwarm', linewidth=0, antialiased=False)

# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()

关键说明

  • griddata的method参数:
    • 'nearest':最近邻插值,速度最快但曲面可能有棱角
    • 'linear':线性插值,曲面平滑度中等
    • 'cubic':三次插值,曲面最平滑,匹配你的期望效果
  • 如果离散点分布不均匀,可能出现部分网格无插值结果(NaN),可根据需求处理这些值,比如用0填充或过滤

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:32:49