爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 250|回复: 7

[求助] 求解答如何用python画micaps第一类数据

[复制链接]

新浪微博达人勋

发表于 2024-11-8 21:47:19 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 谷艳茹 于 2024-11-8 21:50 编辑

求解答如何用python画micaps第一类的地面观测要素的站点分布图
1、数据已经读出来了,但是风数据格式显示quantity object of print module,温度也画不出图
2、还有几个变量可以一起读出来吗
第一类数据存放格式如下:
区站号(长整数)  经度  纬度  拔海高度(均为浮点数) 站点级别(整数)  总云量  风向  风速  海平面气压(或本站气压)  3小时变压  过去天气1  过去天气2  6小时降水 低云状  低云量  低云高  露点  能见度  现在天气  温度 中云状  高云状  标志1  标志2(均为整数) 24小时变温  24小时变压


截图.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2024-11-10 20:44:51 来自手机 | 显示全部楼层
【气Py-45-Metpy-下-哔哩哔哩】【视频标记点 00:40】 https://b23.tv/6MXJ59H
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-11-11 15:46:39 | 显示全部楼层
edwardli 发表于 2024-11-10 20:44
【气Py-45-Metpy-下-哔哩哔哩】【视频标记点 00:40】 https://b23.tv/6MXJ59H

非常感谢!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-11-11 20:43:48 | 显示全部楼层
edwardli 发表于 2024-11-10 20:44
【气Py-45-Metpy-下-哔哩哔哩】【视频标记点 00:40】 https://b23.tv/6MXJ59H

请问您的代码哪里能获取完整的呢谢谢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-11-12 14:30:02 来自手机 | 显示全部楼层
谷艳茹 发表于 2024-11-11 20:43
请问您的代码哪里能获取完整的呢谢谢

详见B站主页专栏文章。或者气象家园论坛内搜索:千金散尽还复来
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-11-13 10:33:00 | 显示全部楼层
  1. """
  2. Spyder Editor

  3. OLDLee.
  4. """
  5. ###引用部分
  6. import numpy as np
  7. import pandas as pd
  8. from PIL import Image

  9. from metpy.calc import wind_components
  10. from metpy.plots import StationPlot
  11. from metpy.plots.wx_symbols import current_weather, sky_cover
  12. from metpy.units import units

  13. import cartopy.crs as ccrs
  14. import cartopy.feature as feat
  15. import matplotlib.pyplot as plt
  16. import cartopy.io.shapereader as shpreader

  17. plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文
  18. plt.rcParams['axes.unicode_minus']=False #用来正常显示负号


  19. ## 数据读取 与 整理
  20. a=r"data/Metpy/Surf14090120.000"
  21. df=pd.read_csv(a,skiprows=3,header=None,encoding="GB2312",sep='\s+').drop([0])
  22. df1=df.iloc[::2].reset_index(drop=True)
  23. df2=df.iloc[1::2].reset_index(drop=True)
  24. df1=df1.drop(columns=[12,13])
  25. head=["stid","lon","lat","h","lev","cloud_fraction","wind_dir",
  26.       "wind_speed","slp","p3","w1","w2","r6","lc","lcc","lch",
  27.       "dew_point_temperature","vv","weather","air_temperature","mc","hc","s1","s2","T24","P24"]
  28. res=pd.concat([df1,df2],axis=1,ignore_index=True)
  29. res.columns=head
  30. res[['stid','cloud_fraction','weather','w1','w2','lcc','lc','lch','mc','hc','p3','r6']]=res[['stid','cloud_fraction','weather','w1','w2','lcc','lc','lch','mc','hc','p3','r6']].astype('int')
  31. res=res[res['stid']<80000]
  32. res['weather']=res['weather'].replace(9999,0)
  33. res['wind_speed']=res['wind_speed'].replace(9999,0)
  34. res['weather']=res['weather'].astype('int')
  35. res['cloud_fraction']=res['cloud_fraction'].replace(9999,10)


  36. ## 数据筛选 与 处理
  37. all_data = res[['stid','lat','lon','slp','air_temperature','cloud_fraction','dew_point_temperature','weather','wind_dir','wind_speed','p3','r6']]
  38. #挑选目标区域内的站点站号白名单
  39. with open ('data/Metpy/whitelist.txt') as f:
  40.     whitelist=[int(id) for id in list(f)]
  41. # 找出数据和白名单交集的站号
  42. data=all_data[all_data['stid'].isin(whitelist)]
  43. ###########################################
  44. # 现在有了需要的数据, 需要做一些转换:
  45. #
  46. # - 获得所需站点站号的字符串列表   Get a list of strings for the station IDs
  47. # - 由风速、风向,计算U、V分量    Get wind components from speed and direction
  48. # - 转换总云量为电码**            Convert cloud fraction values to integer codes [0 - 8]
  49. # - 映射天气现象电码,以匹配符号   Map METAR weather codes to WMO codes for weather symbols

  50. p3 = data['p3']
  51. p3.where(p3>999,np.nan,inplace=True)
  52. r6 = data['r6']
  53. r6.where(r6>150,np.nan,inplace=True)
  54. r6.where(r6<=0,np.nan,inplace=True)
  55. data['slp'][data['slp']>9000]=np.NaN
  56. stids =[str(id) for id in list(data['stid'].values)]
  57. u, v = wind_components((data['wind_speed'].values * units('m/s')),data['wind_dir'].values * units.degree)
  58. cloud_frac = (data['cloud_fraction']).astype(int)
  59. wx_text = [s for s in data['weather']]
  60. li=np.arange(0,100)
  61. wx_codes = dict(zip(list(map(str,li)),li))
  62. wx = [wx_codes[s.split()[0] if ' ' in str(s) else str(s)] for s in wx_text]


  63. ## 绘图部分
  64. proj = ccrs.PlateCarree()
  65. fig = plt.figure(figsize=(20,14),dpi=200)
  66. ax = fig.add_subplot(1, 1, 1, frameon=False,projection=ccrs.LambertConformal(central_longitude=80,central_latitude=35.))
  67. ax.set_extent((70, 100, 30, 50))
  68. ax.add_feature(feat.LAKES, zorder=1)
  69. ax.add_feature(feat.LAND, zorder=-1)
  70. ax.add_feature(feat.OCEAN, zorder=-1)
  71. ax.add_feature(feat.RIVERS, zorder=1)
  72. # ax.coastlines(resolution='110m', zorder=2, color='black')
  73. # ax.add_feature(feat.BORDERS, linewidth='2', edgecolor='black')

  74. ##### 声明地面填图绘图区系列
  75. stationplot = StationPlot(ax, data['lon'], data['lat'], transform=proj,fontsize=4.5)

  76. # 在左上角绘制温度(红色),左下角绘制露点(绿色)
  77. data['air_temperature'][data['air_temperature']>9000]=np.NaN
  78. data['dew_point_temperature'][data['dew_point_temperature']>9000]=np.NaN
  79. stationplot.plot_parameter('NW', data['air_temperature'], color='red',transform=proj)
  80. stationplot.plot_parameter('SW', data['dew_point_temperature'], color='darkgreen',transform=proj)

  81. # 按照天气图填图规范,填注三位数的海平面气压:
  82. # 1000hPa以下减900,再乘以10;1000以上减1000,再乘以10
  83. stationplot.plot_parameter('NE', data['slp'],
  84.                            formatter=lambda v: format(1 * v, '.0f')[-4:],transform=proj)
  85. # 在站点右上角填注3小时变压
  86. stationplot.plot_parameter('E', data['p3'],transform=proj)
  87. # 在站点右下角填注6小时降水
  88. stationplot.plot_parameter('SE', r6,transform=proj)

  89. # 在居中位置绘制总云量符号。将总云量成数,转为MetPy定义的sky_cover。
  90. stationplot.plot_symbol('C', cloud_frac, sky_cover,transform=proj)

  91. # 将站点中心视为原点,在(-1,0)位置,也就是正西方向,绘制现在天气符号;在(2,-1)右下角位置,填写站号
  92. stationplot.plot_symbol((-1,0), wx, current_weather,transform=proj,fontsize=5)
  93. stationplot.plot_text((2,-1), stids,transform=proj,fontsize=2.5)

  94. # 添加风羽
  95. stationplot.plot_barb(u, v,transform=proj,barb_increments={'half':2, 'full':4, 'flag':20},sizes={'emptybarb':0.0})
  96. ax.gridlines(linestyle='--',
  97.              xlocs=[60,70,80,90,100,110,120,130,140,150],
  98.              ylocs=[10,20,30,40,50,60,70])

  99. # 添加一些基本的地理信息
  100. shpborder='shp/NationalBorder.shp'
  101. adm1_shapes = list(shpreader.Reader(shpborder).geometries())
  102. ax.add_geometries(adm1_shapes[:],ccrs.PlateCarree(),edgecolor='k',facecolor='None',linewidth=0.8)


  103. ### 这一段的意义在于:
  104. ### 注意这个x和y的值很大,是最后一个“局地绘图区”的相对位置!!!
  105. ### 如后续例图所示
  106. # #添加左下角的文本、矩形框
  107. # rect = plt.Rectangle((-2650000,-1800000),1450000,850000,
  108. # facecolor ='w',edgecolor='k',alpha=0.9)
  109. # ax.add_patch(rect)
  110. # ax.text(-2600000, -1100000,'地   面   天   气   图',fontsize=20)
  111. # ax.text(-2600000, -1300000,year+' 年 '+month+'月 '+day+'日 '
  112. # +valid+'时',fontsize=20)
  113. # ax.text(-2600000, -1500000,'分析预报员:__________',fontsize=20)

  114. ## 预览输出
  115. plt.show()
复制代码
QQ20241113-103140.png QQ20241113-103204.png
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 6 天前 来自手机 | 显示全部楼层
【雷小Py-027:MICAPS地面高空站点1_2024.11.15-哔哩哔哩】 https://b23.tv/aGSsitT   【雷小Py-028:MICAPS地面高空站点2_2024.11.16-哔哩哔哩】 https://b23.tv/XAV5tm0
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 6 天前 来自手机 | 显示全部楼层
【雷小Py:MICAPS地面高空站点填图】  https://b23.tv/chjdAhf https://b23.tv/ZKxkZ83 https://b23.tv/69tzXRe
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

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