python气象数据可视化学习笔记8——利用matplotlib和ERA5数据绘制时间-高度气象综合廓线图

这篇具有很好参考价值的文章主要介绍了python气象数据可视化学习笔记8——利用matplotlib和ERA5数据绘制时间-高度气象综合廓线图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 效果图

python气象数据可视化学习笔记8——利用matplotlib和ERA5数据绘制时间-高度气象综合廓线图

2. 总体思路

  • 气象预报业务中,有种常用的综合廓线图,其本质上是单个站点时间-高度的等高线或者填色图,其中时间是从右到左来看。所以准备好(time, level)的二维数据,然后依次叠加线条和填色就可以,思路很简单,但是绘图中涉及到了很多细节问题,也是琢磨了一阵子,怕以后忘了,记录下学习过程。
# %%
import xarray as xr
import numpy as np 
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.pyplot import MultipleLocator #导入此类,设置坐标轴间隔
import pandas as pd
from scipy.ndimage import gaussian_filter1d
from matplotlib.font_manager import FontProperties 
mpl.rcParams["font.size"] = 13
font_cn = FontProperties(fname="C:/Users/xxx/anaconda3/Lib/site-packages/matplotlib/mpl-data/fonts/chinese_ttf/方正楷体简体.ttf", size=14) 
  • 导入的库主要有三类:
    (1)读取数据的xarray和进行简单计算的numpy,pandas.
    (2)绘图的matplotlib
    (3)平滑曲线的scipy
    就是这么简单!

3. 读取数据

  • ERA5:这次的例子中使用的是ERA5的再分析数据,首先利用xr.open_dataset读取数据,利用ds.sel()选择需要的时间范围,最后选取需要的变量。图中主要用到的是气温t, 相对湿度r,水平风u,v和垂直速度w。
# read data
data_path = "D:/python/CSDN/data/ERA5-pressure_20230301-0304.nc"
time_range = pd.date_range('2023-02-01', periods=24*3+1, freq='H')
ds = xr.open_dataset(data_path).sel(time=time_range)
rh, temp, u, v, w = ds['r'], ds['t']-273.15, ds['u'], ds['v'], ds['w']   # (time,level, lat, lon)
  • 挑选站点和level,原始数据中“time”维度在“level”维度之前,为了绘制综合廓线图,需要用transpose对二者维度的顺序做调换。其次,level是从100-1000hPa, time也是从小到大,为了满足图片中高度从低到高、时间从右到左进行读取的习惯,需要进行reverse的处理。
  • 另外一个重要的点是如何从UTC转为北京时。首先用pd.to_datetime(time, utc=True)对time设置为utc, 然后利用.tz_convert(‘Asia/Shanghai’)转换为北京时,最后用.strftime(‘%d%H’).tolist()设置为日+时的显示格式,并设置为列表。琢磨了半天,这种方法最方便!
# %%
# 挑选站点,转换time, level坐标顺序,并调整level(1000hPa->100hPa),time排序(倒序)
lat, lon = 39.8, 116.47
level = [100,150,200,300,400,500,600,700,800,850,900,925,1000]
rh_bj= rh.sel(latitude = lat, longitude = lon, level = level, method = 'nearest').transpose("level","time")[::-1, ::-3].values  
temp_bj= temp.sel(latitude = lat, longitude = lon, level = level, method = 'nearest').transpose("level","time")[::-1, ::-3].values  
u_bj= u.sel(latitude = lat, longitude = lon, level = level, method = 'nearest').transpose("level","time")[::-1, ::-3].values  
v_bj= v.sel(latitude = lat, longitude = lon, level = level, method = 'nearest').transpose("level","time")[::-1, ::-3].values  
w_bj= w.sel(latitude = lat, longitude = lon, level = level, method = 'nearest').transpose("level","time")[::-1, ::-3].values 
time = rh['time'][::-3]
time_str = pd.to_datetime(time, utc=True).tz_convert('Asia/Shanghai').strftime('%d%H').tolist()  #datetime64转为string,和utc+8
  • 数据平滑这一步,看自己的需求。如果觉得直接绘制出来的线条还行,这一步可以忽略。如果觉得线条太生硬,可以利用gaussian_filter1d进行平滑,其中sigma越大,表明线条越平滑,相应的也更加失真,自己根据需求可多加尝试。
# 平滑等高线数据
rh_bj = gaussian_filter1d(rh_bj, sigma=0.5)  #sigma数值越大 越平滑
w_bj = gaussian_filter1d(w_bj, sigma=1)
temp_bj = gaussian_filter1d(temp_bj, sigma=0.5)

以上是利用ERA5的原始数据绘制综合廓线图的读取数据部分,如果自己有其他模式或者其他格式的数据,只要处理成(level, time)的二维数据,其中level和time坐标都是从大到小排列就好。

4. 图形绘制

  • RH填色图:建立画布和坐标后,首先可以利用ax.contourf绘制RH填色图。其中,利用levels指定显示的色标及间隔,extend='both’添加后colorbar的最大最小值之外还有填色,这种情况下extendrect默认为False,colorbar的两头是三角形,如果不需要三角,可手动设置为True。fig.colorbar中shrink表示colorbar缩短的比例,pad是colorbar离图片的距离,extendfrac='auto’表示colorbar两头三角形的大小自动和colorbar里每个间隔的长短一致,如果不设置这个,默认的三角形很小,不美观。填色图中唯一遗憾的是cmap没有找到特别合适的,后期还需要自己单独设置colormap。
#建立画布
fig = plt.figure(figsize=(12, 6))
ax = fig.add_subplot(1,1,1)

#添加RH填色图
rh_plot = ax.contourf(rh_bj, cmap = 'Greens',levels=[60,70,80,90,95], extend='both', alpha=0.7)
fig.colorbar(rh_plot, ax=ax, shrink=0.6, pad=0.02,extendfrac='auto')  #添加label bar
  • temp,w等高线图:等高线的绘制利用ax.contour,比较简单。默认状态下如果数值大于0,则线条为实线,小于0则为虚线,与综合廓线图中的要求一致,所以就不需要单独设置了。ax.clabel用来在等高线中添加label数值,也比较简单。
#添加temp, w等高线
temp_plot = ax.contour(temp_bj, colors='r') # Negative contours default to dashed.
w_plot = ax.contour(w_bj, colors='k',alpha=0.7)
ax.clabel(temp_plot, inline=True, fontsize=10) #添加等高线label
ax.clabel(w_plot, inline=True, fontsize=10)
  • 风羽风向标:ax.barbs用来绘制风羽,其中最重要的是需要设置barb_increments。默认的设置里,半个横杆为5,一个横杆为10,一个旗子为50。但是在中国的风羽使用中,半个横杆为2 m/s, 一个为4,旗子为20,所以需要利用barb_increments = dict(half=2, full=4, flag=20)字典的形式进行设置。
  • 这里需要注意的是,中国的风羽使用中,flag为空心则为20,实心则为50,但是ax.barbs中旗子要么是空心要么实心,没有办法直接同时设置两种。如果需要设置2种,需要修改源代码。
#画风向标
barb_increments = dict(half=2, full=4, flag=20)
ax.barbs(u_bj, v_bj, color = 'b',length= 7, alpha=0.8, barb_increments=barb_increments)
  • 添加横纵坐标对应的时间和高度:y_pos和y_labels分别对应选择显示出来的y轴位置和对应的label,然后利用ax.set_yticks设置就好。x轴的设置同理。此外,ax.xaxis.set_major_locator和ax.xaxis.set_min_locator用来设置主刻度和次刻度的间隔。
#添加横纵坐标对应的时间和高度
#y轴
y_pos = [0,1,3,5,7,10,12] 
y_labels = [1000,925,850,700,500,200,100]
ax.set_yticks(y_pos, labels=y_labels)   #显示特定xticklabels
ax.set_ylim(-0.5,len(level)+0.1)   #上下留出一点空白
#x轴
x_pos = np.arange(len(time_str)) 
ax.set_xticks(x_pos, labels=time_str)
ax.xaxis.set_major_locator(MultipleLocator(4))  #设置x轴主刻度显示间隔
ax.xaxis.set_minor_locator(MultipleLocator(2)) #设置x轴次刻度显示间隔
  • 添加标题、xlabel等图片说明信息:这里的一个小细节是如何使用中文字体。在开头中设置了 font_cn = FontProperties(fname=“C:/Users/xxx/anaconda3/Lib/site-packages/matplotlib/mpl-data/fonts/chinese_ttf/方正楷体简体.ttf”, size=14) ,这里直接利用fontproperties使用就好。想使用什么样的中文字体,下载到指定位置,如上述这样使用即可。
#添加标题、xlabel等图片说明信息
ax.text(23,-2,'Feb',color='r')
ax.text(0,-2,'北京时',fontproperties = font_cn)
ax.text(0,13.3,'Lat:'+str(lat)+' Lon:'+str(lon),size=15,color='r')
ax.text(21,13.3,'000-072',size=15,color='b')
ax.text(10,13.3,'2023020100',size=15,color='b')
ax.text(7,14,'单点3小时间隔综合廓线图', fontproperties = font_cn, size=22,color='b')
ax.set_ylabel("hPa")

大功告成!文章来源地址https://www.toymoban.com/news/detail-453383.html

5. 代码完整版

# %%
import xarray as xr
import numpy as np 
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.pyplot import MultipleLocator #导入此类,设置坐标轴间隔
import pandas as pd
from scipy.ndimage import gaussian_filter1d
from matplotlib.font_manager import FontProperties 
mpl.rcParams["font.size"] = 13
font_cn = FontProperties(fname="C:/Users/xxx/anaconda3/Lib/site-packages/matplotlib/mpl-data/fonts/chinese_ttf/方正楷体简体.ttf", size=14) 
# %%
# read data
data_path = "D:/python/CSDN/data/ERA5-pressure_20230301-0304.nc"
time_range = pd.date_range('2023-02-01', periods=24*3+1, freq='H')
ds = xr.open_dataset(data_path).sel(time=time_range)
rh, temp, u, v, w = ds['r'], ds['t']-273.15, ds['u'], ds['v'], ds['w']   # (time,level, lat, lon)

# %%
# 挑选站点,转换time, level坐标顺序,并调整level(1000hPa->100hPa),time排序(倒序)
lat, lon = 39.8, 116.47
level = [100,150,200,300,400,500,600,700,800,850,900,925,1000]
rh_bj= rh.sel(latitude = lat, longitude = lon, level = level, method = 'nearest').transpose("level","time")[::-1, ::-3].values  
temp_bj= temp.sel(latitude = lat, longitude = lon, level = level, method = 'nearest').transpose("level","time")[::-1, ::-3].values  
u_bj= u.sel(latitude = lat, longitude = lon, level = level, method = 'nearest').transpose("level","time")[::-1, ::-3].values  
v_bj= v.sel(latitude = lat, longitude = lon, level = level, method = 'nearest').transpose("level","time")[::-1, ::-3].values  
w_bj= w.sel(latitude = lat, longitude = lon, level = level, method = 'nearest').transpose("level","time")[::-1, ::-3].values 
time = rh['time'][::-3]
time_str = pd.to_datetime(time, utc=True).tz_convert('Asia/Shanghai').strftime('%d%H').tolist()  #datetime64转为string,和utc+8

# 平滑等高线数据
rh_bj = gaussian_filter1d(rh_bj, sigma=0.5)  #sigma数值越大 越平滑
w_bj = gaussian_filter1d(w_bj, sigma=1)
temp_bj = gaussian_filter1d(temp_bj, sigma=0.5)
# %%
#建立画布
fig = plt.figure(figsize=(12, 6))
ax = fig.add_subplot(1,1,1)

#添加RH填色图
rh_plot = ax.contourf(rh_bj, cmap = 'Greens',levels=[60,70,80,90,95], extend='both', alpha=0.7)
fig.colorbar(rh_plot, ax=ax, shrink=0.6, pad=0.02,extendfrac='auto')  #添加label bar

#添加temp, w等高线
temp_plot = ax.contour(temp_bj, colors='r') # Negative contours default to dashed.
w_plot = ax.contour(w_bj, colors='k',alpha=0.7)
ax.clabel(temp_plot, inline=True, fontsize=10) #添加等高线label
ax.clabel(w_plot, inline=True, fontsize=10)

#画风向标
barb_increments = dict(half=2, full=4, flag=20)
ax.barbs(u_bj, v_bj, color = 'b',length= 7, alpha=0.8, barb_increments=barb_increments)
#添加横纵坐标对应的时间和高度
#y轴
y_pos = [0,1,3,5,7,10,12] 
y_labels = [1000,925,850,700,500,200,100]
ax.set_yticks(y_pos, labels=y_labels)   #显示特定xticklabels
ax.set_ylim(-0.5,len(level)+0.1)   #上下留出一点空白
#x轴
x_pos = np.arange(len(time_str)) 
ax.set_xticks(x_pos, labels=time_str)
ax.xaxis.set_major_locator(MultipleLocator(4))  #设置x轴主刻度显示间隔
ax.xaxis.set_minor_locator(MultipleLocator(2)) #设置x轴次刻度显示间隔

#添加标题、xlabel等图片说明信息
ax.text(23,-2,'Feb',color='r')
ax.text(0,-2,'北京时',fontproperties = font_cn)
ax.text(0,13.3,'Lat:'+str(lat)+' Lon:'+str(lon),size=15,color='r')
ax.text(21,13.3,'000-072',size=15,color='b')
ax.text(10,13.3,'2023020100',size=15,color='b')
ax.text(7,14,'单点3小时间隔综合廓线图', fontproperties = font_cn, size=22,color='b')
ax.set_ylabel("hPa")

plt.savefig("综合廓线图.jpg")

到了这里,关于python气象数据可视化学习笔记8——利用matplotlib和ERA5数据绘制时间-高度气象综合廓线图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于hadoop的气象数据可视化分析

    目 录 摘 要 I Abstract III 1绪论 1 1.1选题背景及意义 1 1.2研究现状及趋势 1 1.3研究主要内容 2 2相关技术简介 3 2.1开发工具 3 2.1.1 JDK1.7 3 2.1.2 eclipse luna 3 2.1.3 Hadoop 2.7.2 3 2.1.4 hbase 1.1.3 3 2.1.5 hive 1.2.1 3 2.1.6 zookeeper 3.4.8 4 2.1.7 mysql 5.5 4 2.1.8 swing 4 2.1.9 VMware Workstation 12 Pro 4 2.1.10其他辅助

    2024年02月02日
    浏览(45)
  • 【Python设计】基于Python Flask的全国气象数据采集及可视化系统-附下载方式以及项目参考论文,项目其他均为抄袭

    本项目是一个基于Web技术的实时气象数据可视化系统。通过爬取中国天气网的各个城市气象数据,并将其保存到自己的数据库中,我们利用Python、Flask、ECharts和MySQL等技术,实现了数据的分析和可视化呈现。这是一个采用B/S架构的现代化气象数据管理系统,用户只需通过浏览

    2024年02月11日
    浏览(58)
  • 城市气象数据可视化:洞察气候变化,构建智慧城市

    随着 城市化 进程的加速,城市气象数据的采集和分析变得越来越重要。气象数据不仅影响着人们的生活和出行,还与城市的发展和规划息息相关。在数字化时代,如何将城市中各个气象数据进行可视化,让复杂的数据变得简单易懂,成为了一个亟待解决的问题。 第一步:收

    2024年02月15日
    浏览(55)
  • 利用Python进行数据可视化Plotly与Dash的应用【第157篇—数据可视化】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 数据可视化是数据分析中至关重要的一环,它能够帮助我们更直观地理解数据并发现隐藏的模式和趋势。在Python中,有许多强大的工具可以用

    2024年04月14日
    浏览(71)
  • 【数据分析与可视化】利用Python对学生成绩进行可视化分析实战(附源码)

    需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 下面对学生成句和表现等数据可视化分析 1:导入模块 2:获取数据 并打印前四行  属性列表对应含义如下 Gender  性别 Nationality  国籍 PlaceofBirth 出生地 Stageid 学校级别 Gradeid 年级 Sectionid  班级 Topic 科目 semester 学期 ra

    2024年02月03日
    浏览(49)
  • python金融数据分析和可视化--03利用Akshare获取股票数据

    AKShare 是基于 Python 的财经数据接口库,目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具,主要用于学术研究目的。 AKShare 的特点是获取的是相对权威

    2024年02月05日
    浏览(44)
  • 微博数据可视化分析:利用Python构建信息图表展示话题热度

    1. 引言 随着社交媒体的迅速发展,微博已成为人们交流观点、表达情感的重要平台之一。微博评论数据蕴含着丰富的信息,通过对这些数据进行分析和可视化,我们可以深入了解用户对特定话题的关注程度和情感倾向。本文将介绍如何利用Python进行微博评论数据的准备、探索

    2024年02月20日
    浏览(56)
  • Python网络爬虫爬取招聘数据(利用python简单零基础)可做可视化

    身为一个求职者,或者说是对于未来的职业规划还没明确目标的大学生来说,获取各大招聘网上的数据对我们自身的发展具有的帮助作用,本文章就简答零基础的来介绍一下如何爬取招聘数据。 我们以东莞的Python数据分析师这个职位来做一个简单的分析,页面如下图所示:

    2024年02月03日
    浏览(58)
  • 对利用Python爬取到的房价信息做数据可视化(附完整代码)

          大家好,我是带我去滑雪,每天教你一个小技巧! 本文利用Python爬取到的房价信息做数据可视化,爬取数据的文章见: (利用Python爬取房价信息(附代码)_用python爬取房价数据_带我去滑雪的博客-CSDN博客)       所爬取的指标有小区名称、房屋位置、房屋户型、房屋面

    2024年02月02日
    浏览(47)
  • 哨兵2号数据下载与利用Python处理(波段融合、降采样、可视化、裁剪等)

    网址:https://scihub.copernicus.eu/dhus/#/home 哨兵2号(Sentinel-2)是欧洲空间局(European Space Agency,简称ESA)推出的一组遥感卫星,旨在为地球观测和环境监测提供高质量的光学图像数据。 S2MSI2A是哨兵2号卫星的一种传感器。 S2MSI2A是哨兵2号卫星搭载的多光谱成像仪(MultiSpectral Ins

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包