Contourf无法显示完整数值范围的技术问题咨询
问题:contourf绘制全量随机数据时仅显示高值区域的问题
我有两个数据集,对比后得到的数值在-1到1之间随机分布,但用contourf绘图时,图表几乎只显示数值>0.5的区域;抽稀数据(每隔10个点取一个)后绘图,结果才正常。用同尺寸随机数列表复现了这个问题,现象一致。
复现代码:
import numpy as np import matplotlib.pyplot as plt from netCDF4 import Dataset from matplotlib.cm import get_cmap random = np.random.random((360,1600))*2.-1. f, ax = plt.subplots(1,2,figsize=(15,5)) clevs = [-0.5,-0.1,0.1,0.5] diffplot = ax[0].contourf(random[::10,::10],clevs,extend='both') cbar = f.colorbar(diffplot,ax=ax[0]) clevs = [-0.5,-0.1,0.1,0.5] diffplot2 = ax[1].contourf(random[:,:],clevs,extend='both') cbar = f.colorbar(diffplot2,ax=ax[1])
原因分析
contourf是基于等值线填充的绘图工具,它会对输入数据进行插值拟合来生成平滑的等值线区域。当数据量极大(360×1600共57.6万个点)且完全随机时,高频噪声会干扰插值算法,导致大部分区域被误判为接近极值(>0.5或<-0.5),最终呈现出只显示高值区域的异常结果。而抽稀后数据密度降低,噪声的影响被削弱,插值能更合理地反映数据的真实分布。
解决方法
- 调整插值方式:给
contourf指定无插值或低分辨率插值,避免噪声干扰:diffplot2 = ax[1].contourf(random[:,:], clevs, extend='both', interpolation='none') - 细化等值线层级:增加层级数量,让颜色划分更精细,能更准确展示数据分布:
clevs = np.linspace(-1, 1, 21) # 生成-1到1之间的20个间隔层级 diffplot2 = ax[1].contourf(random[:,:], clevs, extend='both') - 改用pcolormesh绘图:如果不需要等值线效果,
pcolormesh直接绘制每个数据点的色块,无插值,更适合展示原始随机数据:diffplot2 = ax[1].pcolormesh(random[:,:], vmin=-1, vmax=1, cmap=get_cmap('RdBu'))
内容的提问来源于stack exchange,提问作者ZLebo
相关产品推荐
相关产品推荐

