前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python气象绘图教程(十二)

Python气象绘图教程(十二)

作者头像
气象学家
发布2020-06-17 17:20:54
3.7K0
发布2020-06-17 17:20:54
举报
文章被收录于专栏:气象学家气象学家

本节提要: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:\Users\lenovo\Desktop\ex1.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:\dijishi\cn_province.shp' ,420000)
cb=fig.colorbar(cs,extend='both',shrink=0.65)

下节预告:Cartopy教程—4(实用的制图命令)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象学家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档