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

数组长度随迭代变化的3D surface plot绘制异常求助

解决3D曲面图因数组长度不一致导致的绘制问题

原代码的核心问题是:每次循环仅针对单个M值生成对应J的序列,通过meshgrid得到的是该M值重复多次的数组,本质上是在绘制多条"拉伸"的平面,而非连续的3D曲面。要解决这个问题,需要先构建完整的M-J网格,对无效的(M,J)组合填充NaN(matplotlib会自动忽略这些点),再统一计算K值。

修改后的代码

import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1, projection='3d')
ax.set_xlabel("M")
ax.set_ylabel("J")
ax.set_zlabel("K")

# 定义M的取值范围
M_vals = np.arange(1, 5)
# 确定J的最大范围(覆盖所有M对应的J区间)
J_max = max(M*3 for M in M_vals)
J_vals = np.arange(1, J_max)

# 生成完整的M-J网格
M_mesh, J_mesh = np.meshgrid(M_vals, J_vals)

# 计算K值:仅当J在[M, 3M)范围内时有效,否则设为NaN
K_mesh = np.where((J_mesh >= M_mesh) & (J_mesh < 3*M_mesh), M_mesh + J_mesh, np.nan)

# 绘制3D曲面
surf = ax.plot_surface(M_mesh, J_mesh, K_mesh, cmap=cm.coolwarm,
                       linewidth=0.1, alpha=0.7)

fig.colorbar(surf, shrink=0.5, aspect=5, pad=0.1)
plt.show()

关键说明

  • 构建完整网格:先生成所有M和J的可能取值,通过meshgrid得到二维网格,确保坐标轴长度一致。
  • 处理无效数据:用np.where判断每个(M,J)组合是否有效(J在[M, 3M)区间内),无效位置填充np.nan,matplotlib绘制曲面时会自动跳过这些NaN点,只保留有效区域。
  • 统一绘制:不再循环绘制单个M对应的面,而是基于完整网格一次性绘制曲面,得到连续的3D效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:07:00