调整Contour Plots等高线图绘制值 剔除负值匹配数值解效果的方法咨询
等高线图负值异常修正方案
问题根因
- 闭式解仅取前25项级数计算存在截断误差,边界区域会产生无意义负值
- 两次调用
contourf时采用自动生成的色阶范围,没有对齐数值解的数值区间,导致显示效果不一致 - 之前调整Z值未生效大概率是没有固定等高线层级,matplotlib仍会根据当前数据自动适配色阶
具体修改步骤
- 先获取数值解的数值区间,作为两幅图统一的显示范围
# 先拿到数值解v1的最值(保证两幅图色阶完全一致) v_min = 0 # 也可以直接用v1.min()如果数值解的最小值是合理值 v_max = v1.max() fixed_levels = np.linspace(v_min, v_max, 20)
- 修正闭式解函数的语法错误(当前代码里
sp1.iv(1(n*np.pi*r)/gamma)写法错误,第一参数是阶数,第二参数是自变量,应该改为)
def v(r,z,gamma): a=r*(1-z/gamma) sums = 0 for n in range(1,26): # 修正iv函数的参数写法 sums += ((sp1.iv(1, (n*np.pi*r)/gamma))/(n*sp1.iv(1, (n*np.pi)/gamma)))*np.sin(n*np.pi*z/gamma) return a-(2/np.pi)*sums
- 调整
plot_contour函数,支持固定范围输入,同时裁剪负值
def plot_contour(a, filename=None, zlabel='v(r,z)',cmap=plt.cm.gnuplot, levels=None, vmin=None, vmax=None): fig = plt.figure(figsize=(5,4)) ax = fig.add_subplot(111) x = np.arange(a.shape[0]) y = np.arange(a.shape[1]) X, Y = np.meshgrid(x, y) Z = a[X, Y] # 裁剪负值,也可以用Z[Z<0] = np.nan直接不显示负值区域 if vmin is not None: Z = np.clip(Z, vmin, vmax) # 指定固定levels保证色阶一致 cset = ax.contourf(X, Y, Z, levels=levels if levels is not None else 20, cmap=cmap, vmin=vmin, vmax=vmax) ax.set_xlabel('r') ax.set_ylabel('z') ax.set_title('Γ=2.5') ax.axis('off') ax.set_aspect(1) cb = fig.colorbar(cset, shrink=0.5, aspect=5) cb.set_label(zlabel) if filename: fig.savefig(filename,dpi=1600) plt.close(fig) return filename else: return ax
- 调用的时候统一传入固定参数即可
# 绘制数值解 plot_contour(v1, 'gamma25e+1_num', levels=fixed_levels, vmin=v_min, vmax=v_max) # 绘制闭式解,v_closed为你生成的闭式解矩阵 plot_contour(v_closed, 'gamma25e+1_closed', levels=fixed_levels, vmin=v_min, vmax=v_max)
如果需要完全隐藏负值区域而不是置为最小值,把
Z = np.clip(Z, vmin, vmax)换成Z[Z < vmin] = np.nan即可,matplotlib会自动留白负值区域,不会绘制。
内容的提问来源于stack exchange,提问作者help
相关产品推荐
相关产品推荐

