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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:56:04