python图片分析中央气象台降水_Python气象绘图教程(十)

这几天一直在躺尸,只能找一些陈年材料和汇总了

本节提要:matplotlib绘图时,一些实用的解决办法。包括降水量等值线的色号、风矢杆显示不正确的问题、台风符号、散点图表示数值的两种办法、关于colobar的一些常用参数。

一、降水量等值线的色号

作为业务上常见应用,在绘制降水量等值线填色图时,不能使用系统默认的colormap,而需要指定降水等级和填色。本文使用中央气象台官网的降水量图片,通过一个木函中的取色功能调取颜色,参考了微信群中一个大佬提供的代码(具体是谁已经忘了,希望大佬不会砸门@

@)。

ax.bar(x1,y1,color='#A6F28F')ax.bar(x2,y2,color='#3DBA3D')ax.bar(x3,y3,color='#61BBFF')ax.bar(x4,y4,color='#0000FF')ax.bar(x5,y5,color='#FA00FA')ax.bar(x6,y6,color='#800040')

二、风矢杆显示了过多的圆圈

很久之前有个大佬发现自己绘制的图像出现了很多不正确的圆圈,巨佬二号提出了解决方案——因为中外风矢杆量级不一样,所以需要修改风矢杆的风速大小。

大佬出现问题的图是这一张:

我尝试本地风场绘图:

plt.barbs(lon,lat,u,v,zorder=5)

如图,确实出现了许多圆圈,然而在实际数据中,这些数值为1m\s。通过巨佬提供的解决方案,绘制了新的风场图:

plt.barbs(lon,lat,u,v,barb_increments={'half':2,'full':4,'flag':20},zorder=5)

barb_increments={'half':2,'full':4,'flag':20}这一句,修改了风矢杆长短杆线和三角分别代表的风速大小。

三、台风符号

在将cartopy官网例子本土化的过程中,我发现matplotlib的marker中没有现成的台风符号,于是群内巨佬三号提供了解决方案:

方案一:通过数字6和9的叠加来产生台风符号

ax.scatter(x,y2,s=200,marker='$6$',color='crimson')ax.scatter(x,y3,s=200,marker='$9$',color='crimson')

方案二:通过自定义台风符号来绘制

def get_hurricane():u = np.array([ [2.444,7.553],[0.513,7.046],[-1.243,5.433],[-2.353,2.975],[-2.578,0.092],[-2.075,-1.795],[-0.336,-2.870],[2.609,-2.016] ])u[:,0] -= 0.098codes = [1] + [2]*(len(u)-2) + [2]u = np.append(u, -u[::-1], axis=0)codes += codesreturn mpath.Path(3*u, codes, closed=False)hurricane = get_hurricane()ax.scatter(x,y1, s=350, marker=hurricane,edgecolors="crimson", facecolors='none', linewidth=3)

表面上看起来好像两个都可以在绘图实例中使用,但是6与9叠加有一个致命缺陷就是对每一个位置都需要微调,数字9必须比数字6低一点,这样才能产生台风符号,否则就是这样的:

总结下来,在绘制一个台风符号时,可以使用6与9叠加,绘制多个台风符号时,推荐使用def 台风(复制粘贴到程序中即可使用)

四、散点图表示数值大小的两种办法

散点图常用的有两种表示数值大小的办法,一种是通过控制s,即圆圈直径来表示数值;一种是通过控制颜色映射来表示数值。

ax1.scatter(lon,lat,s=number*50,c='blue',alpha=0.75,edgecolor='k')

ax.scatter(lon,lat,s=150,c=number,cmap='cool',alpha=0.75)

五、Colorbar的一些参数

经常有同学在群里讨论色条的尖尖角是怎么来的,于是将color常用的一些参数命令翻译出来了。

ax

代表你需要传入色条的ax

shrink=0.88

代表色条的相对长度

orientation='horizontal'

代表色条时横向还是竖向,vertical代表垂直;horizontal代表水平

cax

表示你需要绘制色条的绝对位置

pad

色条和子图ax之间的距离

extend=’neither’

色条的两头是否变尖,默认为neither,两头为方的。both表示两头变尖。min表示数值小的那头变尖。max表示数值大的那头变尖

ticks

默认将根据你的ax里的间距大小自动分配,可以传入一个列表自定义间距

format

控制刻度样式,如‘%.3f’表示保留三位小数

还是通过上面地闪频次的图来表现参数命令:

b=plt.colorbar(a,shrink=1,orientation='vertical',pad=0.005,extend='max',format='%.2f')

修改了shrink,可以看出其和主图的相对长度变化了。

修改了orientation,色条变为垂直方向。

修改了pad,可以看出色条和子图距离非常近了。

修改了extend,只显示max,即最大值方向变尖。

修改了format,使得刻度显示了两位小数。

关于cax呢,这里也展示一个例子:

position=plt.axes([0.5,0,0.1,1])b=plt.colorbar(a,cax=position,shrink=1,orientation='vertical',pad=0.005,extend='max',format='%.2f')

我们给了colorbar的cax一个绝对位置[0.5,0],表示色条从图上的相对于x轴一半的位置,相对于y轴的起点位置开始绘制。这样色条就被放在中间位置了。我们尝试修改绝对位置的值来深入理解。

position=plt.axes([0.25,0,0.4,0.75])b=plt.colorbar(a,cax=position,shrink=1,orientation='vertical',pad=0.005,extend='max',format='%.2f')

可以看出,色条被移动到差不多x轴上0.25的位置了,色条变宽了,变短了,因为我们将[0.5,0,0.1,1]变成了[0.25,0,0.4,0.75],第三个数表示色条x方向的变化,0.1变为0.4,所以变宽了。第四个数表示色条y方向的变化,1变成了0.75,所以变短了。

Cartopy专辑已经上线

往期回顾:

欢迎关注云台书使公众号

你可能感兴趣的:(python图片分析中央气象台降水_Python气象绘图教程(十))