Matplotlib指定cmap参数后3D曲面图消失问题咨询
问题诱因与解决方法
核心原因
问题的核心诱因是Z数组存在异常值,以及matplotlib颜色映射的归一化逻辑差异:
- 你计算z值的公式为
np.sin(np.sqrt(np.power(x,2)+np.power(y,2)))/np.sqrt(np.power(x,2)+np.power(y,2)),当x=0且y=0时分母为0,会生成NaN(非数值)异常值。 - 不指定cmap参数时,
plot_surface默认采用单一颜色+光照模式渲染,单个NaN只会导致对应位置的小面缺失,不会影响整体曲面显示。 - 明确指定cmap后,matplotlib需要对整个Z数组做值归一化,再映射到配色表的色阶,数组中存在NaN会导致归一化过程失败,最终整个曲面无法渲染,显示为空白。
解决方法
可以通过以下任意一种方式修复问题:
- 手动处理Z数组的异常值,由于
sin(r)/r在r趋近于0时的极限为1,你可以在计算完z后添加一行代码替换异常值:
z = np.nan_to_num(z, nan=1.0)
- 调用
plot_surface时显式指定颜色映射的取值范围,跳过异常值的影响:
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='Blues', edgecolor='none', vmin=np.nanmin(Z), vmax=np.nanmax(Z))
- 适当调大
rstride和cstride的取值(比如设为2),降低网格面密度,避免过密的小面渲染异常。
内容的提问来源于stack exchange,提问作者Gaven
相关产品推荐
相关产品推荐

