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

使用Matplotlib plot_surface绘制含NaN值的矩阵及问题排查

问题分析与解决方案

你的代码生成空白3D图的核心原因是:plot_surface用于绘制连续网格曲面,但你仅设置了3个孤立的非NaN点,周围全是缺失值,Matplotlib无法生成有效的曲面面片,因此显示空白。此外代码还遗漏了numpy的导入语句,这也是潜在报错点。

以下提供两种符合需求的解决方案:


方案1:绘制离散数据点(忽略NaN,仅显示有效点)

如果不需要曲面填充,仅需展示所有非NaN的离散点,用scatter3D替代plot_surface即可:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np  # 补上缺失的numpy导入

fig = plt.figure(figsize=(20,15))
ax = fig.add_subplot(111, projection='3d')

X0=0
Xmax=10
Y0=0
Ymax=10

Xfill,Yfill=np.meshgrid(range(X0,Xmax),range(Y0,Ymax))

data_matrix=np.full(shape=[Xmax,Ymax],fill_value=np.nan)
data_matrix[5,5]=3
data_matrix[1,8]=6
data_matrix[7,2]=0.5

# 提取非NaN的点并绘制散点
mask = ~np.isnan(data_matrix)
ax.scatter3D(Xfill[mask], Yfill[mask], data_matrix[mask], color='blue', s=100)

# 添加坐标轴标签(可选,提升可读性)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

方案2:插值填充NaN,生成连续曲面

如果需要在有效点之间填充曲面,可通过插值方法补全NaN区域的数值,这里使用scipy.interpolate.griddata实现:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import griddata  # 导入插值工具

fig = plt.figure(figsize=(20,15))
ax = fig.add_subplot(111, projection='3d')

X0=0
Xmax=10
Y0=0
Ymax=10

Xfill,Yfill=np.meshgrid(range(X0,Xmax),range(Y0,Ymax))

data_matrix=np.full(shape=[Xmax,Ymax],fill_value=np.nan)
data_matrix[5,5]=3
data_matrix[1,8]=6
data_matrix[7,2]=0.5

# 收集已知的非NaN点数据
known_points = np.column_stack((Xfill[~np.isnan(data_matrix)], Yfill[~np.isnan(data_matrix)]))
known_values = data_matrix[~np.isnan(data_matrix)]

# 用线性插值补全NaN区域(可选method='cubic'生成更光滑曲面,但需要更多已知点)
interpolated_data = griddata(known_points, known_values, (Xfill, Yfill), method='linear')

# 绘制插值后的曲面
ax.plot_surface(Xfill, Yfill, interpolated_data, color='blue', rstride=1, cstride=1, alpha=0.7)
# 叠加原离散点作为参考
ax.scatter3D(Xfill[~np.isnan(data_matrix)], Yfill[~np.isnan(data_matrix)], known_values, color='red', s=100)

ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

plt.show()

注意事项

  • 插值效果依赖已知点的数量:仅3个点时,线性插值会生成平面化的曲面,若要更贴合的曲面需补充更多有效数据
  • 若不需要插值,方案1是最直接的解决方式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:48:28