数组长度随迭代变化的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
相关产品推荐
相关产品推荐

