颜色映射的问题与方法
也是之前的几个后台留言,与最近我遇到的一个关于颜色映射的小技巧。
第一个问题:自制颜色条在contourf中不能正确的显示
使用者制作了一个自定义的颜色条,在contourf颜色使用时,给出的参数不全,导致颜色与数值的对应不正确,我们以降水自制色条为例:
color_levels=np.array([0.1,10,25,50,100,250,500])
color_list=['#A6F28F','#3DBA3D','#61BBFF','#0000FF','#FA00FA','#800040']
rain_colormap=mcolors.ListedColormap(color_list)
norm=mcolors.BoundaryNorm(color_levels,rain_colormap.N)
如果仅给出色条,不给levels和norm参数,数值与颜色会被自适应如下所示,显然数值与颜色与我们想象中的不对应。
x=np.arange(-10,10.5,0.5)
y=x
X,Y=np.meshgrid(x,y)
Z=np.sqrt(X**2+Y**2)
pc=plt.contourf(X,Y,Z,cmap=rain_colormap)
plt.colorbar(pc)
若仅给出cmap与norm参数,也会被自适应掉,导致数值与颜色不能正确对应(请注意,如果是pcolormesh、scatter等命令,到这一步必定能对应,因为他们依靠这两个参数就能确定颜色映射)
pc=plt.contourf(X,Y,Z,cmap=rain_colormap,norm=norm)
解决办法就是使用自制颜色条时,需同时给出levels、cmap、norm三个参数:
pc=plt.contourf(X,Y,Z,levels=color_levels,cmap=rain_colormap,norm=norm)
第二个问题:颜色条数值不能正确对应在颜色分界线上
除开上面这种情况会导致错位外,当颜色条包含颜色数量低于等级数量时,会造成刻度落在颜色里面。以NCL的Cat_12颜色条为例,这个颜色条仅含有12种颜色,当我们划分等级超过12时,也会造成颜色映射错乱:
x=np.arange(-10,10.5,0.5)
y=x
X,Y=np.meshgrid(x,y)
Z=np.sqrt(X**2+Y**2)
pc=plt.contourf(X,Y,Z,levels=np.arange(0,105,5),cmap=cmaps.Cat12)
plt.colorbar(pc)
这是因为颜色条颜色数量少于等级,又要强行映射,导致多个等级落入同一个颜色。解决办法就是加入更多的颜色,或者减少等级。