爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 23369|回复: 2

[经验总结] 利用metpy绘制各要素围绕站点显示的站点图

[复制链接]

新浪微博达人勋

发表于 2021-3-11 17:14:13 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
metpy不仅有一个包括了很多物理参量计算函数的方法:calc,还有一些实用的画图方法,比如在此绘制的站点图。先上图为敬:

图画的一般般,主要是使用了StationPlot这个函数,过程也不复杂,在stationplot.plot_parameter()方法中规定好变量所在站点四周的位置,变量名,格式化输出,以及字体大小和颜色,就可以了。没有可以直接调用的图例方法得到所需的图例,但可以通过画图中图并在其中注解(annotate)的方式达到效果。具体代码如下:
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from metpy.plots import StationPlot #如果因为没装cartopy得到提示\
  4. # cannot import USCOUNTIES and USSTATES without cartopy  installed
  5. # 不用理会
  6. parallels = np.arange(27,34,2)
  7. meridians = np.arange(104,112,2)
  8. labels=['K','TT','CAPE','LI','PW','CIN',chr(952)+'se5-8','H20','H0']
  9. colors=['red','blue','red','blue','red','blue','red','blue','red']
  10. # params为2(2个子图)*4(4个站点)*9(9个变量)
  11. for k in range(params.shape[0]): #画每个子图
  12.      ax[k]=plt.subplot(nrows, ncols, k+1)
  13.      m = Basemap(ax=ax[k],llcrnrlon=104, llcrnrlat=27, urcrnrlon=111, urcrnrlat=33)# 画地图
  14.      CHN='G:\\2019\\los_documentos_de_los_colegos\\hysplit\\'
  15.      m.readshapefile(CHN+'\\gadm36_CHN_shp\\gadm36_CHN_1',
  16.      'states',drawbounds=True)
  17.      m.readshapefile(CHN+'\\gadm36_TWN_shp\\gadm36_TWN_1',
  18.      'taiwan',drawbounds=True)
  19.      m.drawcoastlines()
  20.      m.drawcountries(linewidth=0.5)
  21.      m.drawparallels(parallels,ax=ax[k],linewidth=0.,labels=[1,0,0,0],fontsize=5)# 画经纬度
  22.      m.drawmeridians(meridians,ax=ax[k],linewidth=0.,labels=[1,0,0,1],fontsize=5)# 画经纬度
  23.      stationplot = StationPlot(ax[k],stn_lon,stn_lat,clip_on=True,fontsize=5,spacing=12)
  24.      stationplot.plot_parameter('NW',params[k,:,0], formatter='.0f',color='red') # 画物理量1
  25.      stationplot.plot_parameter('W', params[k,:,1], formatter='.1f',color='blue')# 画物理量2
  26.      stationplot.plot_parameter('SW',params[k,:,2], formatter='.0f',color='red') # 画物理量3
  27.      stationplot.plot_parameter('N', params[k,:,3], formatter='.0f',color='blue')# 画物理量4
  28.      stationplot.plot_parameter('NE',params[k,:,4], formatter='.0f',color='red') # 画物理量5
  29.      stationplot.plot_parameter('E', params[k,:,5], formatter='.0f',color='blue')# 画物理量6
  30.      stationplot.plot_parameter('SE',params[k,:,6], formatter='.1f',color='red') # 画物理量7
  31.      stationplot.plot_parameter('S', params[k,:,7], formatter='.1f',color='blue')# 画物理量8
  32.      stationplot.plot_parameter('C', params[k,:,8], formatter='.0f',color='red') # 画物理量9
  33.      if k==0:
  34.          axlg =fig.add_axes([0.06, 0.6, 0.12, 0.12])  # 确定图中图在子图1中的位置
  35.      else:
  36.          axlg =fig.add_axes([0.53, 0.6, 0.12, 0.12])  # 确定图中图在子图2中的位置
  37.      x=np.arange(3)
  38.      y=np.arange(3)
  39.      y=y[::-1]
  40.      x,y=np.meshgrid(x,y)                    
  41.      axlg.scatter(x,y,s=0) # 确定图中图里各个物理量的位置,散点不画出来
  42.      for l in range(0,x.size): # 绘制图中图里各个物理量
  43.          axlg.annotate(labels[l],xy=(x.flatten()[l],y.flatten()[l]),xytext=(x.flatten()[l],y.flatten()[l]),color=colors[l],fontsize=4)
  44.      axlg.set_xticks([]) # 取消图中图的坐标刻度
  45.      axlg.set_yticks([]) # 取消图中图的坐标刻度
  46.      axlg.set_xlim([-0.15,2.35])# 约束图中图坐标范围
  47.      axlg.set_ylim([-0.15,2.35])# 约束图中图坐标范围
  48. plt.subplots_adjust(top=0.98, bottom=0.08, right=0.95, left=0.05,hspace=0.0, wspace=0.08)
  49. plt.margins(0, 0)
  50. #plt.show()
  51. plt.savefig('G:\\comparisonplot\\stations.jpg',dpi=300,bbox_inches='tight')
复制代码
我的metpy为1.0,还有其他一些依赖库,见打包附件:
另外,StationPlot下还有画风场的plot_barb,plot_arrow,画天气符号的plot_symbol以及写文本的plot_text,大家可以自己取探索。
关于图例,如果大佬有更好的绘制方法欢迎留言回复或者最好mail我:352502026@qq.com


2020051708.jpg

metpy.rar

17.68 MB, 下载次数: 67, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2021-4-9 16:26:10 | 显示全部楼层
谢谢楼主分享,学习了
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-10-10 17:30:08 | 显示全部楼层
谢谢楼主分享
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表