本节提要:colorbar刻度标签的进一步操作、不使用默认ax传入自定义colorbar、matplotlib.colors与colorbar的结合操作。
Colorbar 刻度标签操作
我们已经介绍了ax.tick_params()这个命令的一些应用,这个命令也对colorbar生效。如果要使用该命令,需要先传出colorbar:
代码语言:javascript复制b=plt.colorbar(a,shrink=0.88,orientation='horizontal',extend='both',pad=0.075)
将等号右侧化为简写b,然后通过连接命令操作(好像b不能接受set命令,我目前只发现这个办法):
代码语言:javascript复制b.ax.tick_params()
然后即可以通过在上一节中介绍的关键字参数调节b(即colorbar):
代码语言:javascript复制b.ax.tick_params(direction='in',length=10,width=2,color='k',labelcolor='red',labelsize=20,pad=5)
由于设置了labelsize=20,调大了刻度数字的字号大小,电脑自适应了刻度,这样就只有0,20,40三个刻度标签,显得colorbar右侧刻度标签畸少。所以通过在上一节提到的刻度定位器设定我们需要的刻度:
代码语言:javascript复制b.ax.xaxis.set_major_locator(mticker.FixedLocator(np.arange(10,51,10)))
在这一节中,可能会出现colorbar和子图距离过远,或者刻度标签和colorbar过远的情况,都可以通过关键字参数pad调节距离:
b=plt.colorbar(pad=float)
b.ax.tick_params(pad=float)
不使用默认ax传入自定义colorbar
在前面的教程中,大部分的colorbar都是通过关键字参数传入的默认子图,这在大部分时候是非常方便的,但是某些时候会出现extend='both'命令无法生效的情况,这个时候就需要传入自定义colorbar。
代码语言:javascript复制cmap=mpl.cm.viridis
norm=mpl.colors.Normalize(vmin=6.0,vmax=8.7)
position=plt.axes([0.1,0.25,0.7,0.025])
fig.colorbar(mpl.cm.ScalarMappable(norm=norm,cmap=cmap),cax=position,extend='both',shrink=0.4,label='气温 ℃',orientation='horizontal')
第一句,传入映射颜色。因为要在后面方便比较,所以使用了默认的颜色viridis。
第二句,设定取值条范围,最大6℃,最小8.7℃。
第三句,添加色条子图的绝对位置。
第四句,在画布上添加自定义色条。命令内部具体如何运转,参考官网手册https://matplotlib.org/tutorials/colors/colorbar_only.html#sphx-glr-tutorials-colors-colorbar-only-py
如图,下侧色条为自定义添加,右侧色条为传入默认ax。不过,在这一章中,自定义的色条是没有划分level的,所以色条平滑,而右侧默认色条参考了填色图的level,所以是有分度的,颜色不连续。在下一节中,讲述了这两项的统一操作。
matplotlib.colors 与colorbar 组合操作
这一节,参考了群里某个大佬的程序。主要通过前一节的降水量色号和colorbar进行结合,绘制降水量填色图。
由于matplotlib的colors里面是不包含中央气象台规定的降水色条的,所以需要们自行添加,当然也适用于其他的需要自定义色条的情况。
首先是将站点数据转化为格点数据,使用的是拟造的数据而非降水实况,但原理是一致的:
代码语言:javascript复制filename=r'C:UserslenovoDesktopex1.xlsx'
df=pd.read_excel(filename)
lon=df['lon']#经度
lat=df['lat']#纬度
rain=df['rain']
olon=np.linspace(108,111,90)
olat=np.linspace(29,32,90)
olon,olat=np.meshgrid(olon,olat)
func=Rbf(lon,lat,rain,function='linear')
rain_new=func(olon,olat)
然后自定义降水等级与降水等级对应的色号:
代码语言:javascript复制colorlevel=[0.1,10.0,25.0,50.0,100.0,250.0,500.0]#雨量等级
colordict=['#A6F28F','#3DBA3D','#61BBFF','#0000FF','#FA00FA','#800040']#颜色列表
随后参考官网文档,生成颜色映射:
代码语言:javascript复制rain_map=mcolors.ListedColormap(colordict)#产生颜色映射
norm=mcolors.BoundaryNorm(colorlevel,rain_map.N)#生成索引
在绘制填色图时,传入自定义的颜色表和索引,使用白化程序清除恩施州以外地区的填色,将自定义的颜色表传入colorbar:
代码语言:javascript复制cs= ax.contourf(olon,olat,rain_new,levels=colorlevel,cmap=rain_map,norm=norm)
clip=maskout.shp2clip(cs, ax,r'E:dijishicn_province.shp' ,420000)
cb=fig.colorbar(cs,extend='both',shrink=0.65)