python ERA5 画水汽通量散度图地图:风速风向矢量图、叠加等高线、色彩分级、添加shp文件、添加位置点及备注

news2024/11/17 21:50:50

动机

有个同事吧,写论文,让我帮忙出个图,就写了个代码,然后我的博客好久没更新了,就顺便贴上来了!
很多人感兴趣风速的箭头怎样画,可能这种图使用 NCL 非常容易,很多没用过代码的小朋友,就有点犯怵,怕 python 画起来很困难。但是不然,看完我的代码,就会发现很简单,并且也可以批量,同时还能自定义国界等shp文件,这对于发sci等国际论文很重要,因为有时候内置的国界是有问题的。

数据

本次博客使用的数据为 ERA5 hourly data on pressure levels from 1940 to present数据,数据的下载方式及注册账号,我在前面的博客中都写过,详细可参考以下两篇博客:

http://t.csdnimg.cn/657dg
http://t.csdnimg.cn/YDELh
以下为我们数据介绍界面和需要下载的变量:
数据介绍地址:https://cds.climate.copernicus.eu/cdsapp#!/dataset/reanalysis-era5-pressure-levels?tab=overview
在这里插入图片描述

数据选择界面

在这里插入图片描述

代码

废话不多说,直接上代码。

导入包

import xarray as xr
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import geopandas as gpd
# 设置全局字体为新罗马
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.serif'] = ['Times New Roman']
# plt.rcParams['font.serif'] = ['SimSun']
# 设置全局字体权重为normal
plt.rcParams['font.weight'] = 'normal'

# 设置全局字体大小
matplotlib.rcParams['font.size'] = 19  # 设置全局字体大小为12

画水汽通量散度图

# 加载shapefile
gdf = gpd.read_file(r'./shp/Pronvience.shp')

# 使用geopandas读取地理数据,这里我们手动创建一个GeoDataFrame
gdf_point = gpd.GeoDataFrame({
    'City': ['Mingfeng Station', 'Kalasai Station'],
    'Latitude': [37.5,37],
    'Longitude': [80,81]
}, geometry=gpd.points_from_xy([80,81], [37.5,37]))


# 载入数据
data_path = r'./20170731_case.nc'  # 替换为您的文件路径
ds = xr.open_dataset(data_path)

time = '2017-07-30T22:00:00'

# level_hPa = 700

# for level_hPa in [200,500,700,850]:
for level_hPa in [600]:
    # 选择特定时间和气压层
    ds_selected = ds.sel(time= time, level=level_hPa)  # 示例:2022年1月1日0时,850hPa
    
    # 获取数据变量
    u = ds_selected['u']  # 东西向风速
    v = ds_selected['v']  # 南北向风速
    q = ds_selected['q']  # 比湿
    
    # 获取经度和纬度,假设这些是坐标维度
    longitude = u.longitude
    latitude = u.latitude
    
    # 计算水汽通量
    qu = q * u  # 东西向水汽通量
    qv = q * v  # 南北向水汽通量
    
    
    # 计算水汽通量散度 单位为
    div_q = (qu.differentiate('longitude') + qv.differentiate('latitude'))* 10
    
    # 打印结果
    # print(div_q)
    
    # 创建图形和轴对象
    fig, ax = plt.subplots(figsize=(6, 6),dpi=500)  # 图形尺寸为10x6英寸
    
    # 可视化散度结果
    contour = div_q.plot(add_colorbar=False, cmap="RdBu_r", vmin=-1, vmax=1)  # 使用黑色线条绘制20个等级的等高线
    #
    # 在ax上绘制等高线图
    div_q.plot.contour(levels=25, colors='black',linewidths=0.6)
    # 添加颜色条
    fig.colorbar(contour, ax=ax, label='Water Vapor Flux Divergence (g/cm²/s)')
    
    # 使用quiver函数需要确保数据的间隔,这里我们每隔5个点取样
    Q = ax.quiver(longitude[::5], latitude[::5], u[::5, ::5], v[::5, ::5], scale=300,color="red")
    
    # 绘制shapefile
    gdf.plot(ax=ax, color='none', edgecolor='green',linewidths=0.7)  # 无填充,黑色边界
    
    # gdf_point.plot(ax=ax, color='red')  # 标记纽约的位置
    
    # 绘制点
    ax.scatter(gdf_point['Longitude'], gdf_point['Latitude'], color='red', s=100) 
    
    # 标注城市名称
    for x, y, city in zip(gdf_point['Longitude'], gdf_point['Latitude'], gdf_point['City']):
        ax.text(x, y, ' ' + city, verticalalignment='center', fontsize=15)
    

    
    # 设置经纬度范围
    ax.set_xlim(75, 90)
    ax.set_ylim(30, 45)
    
    ax.set_xlabel('Longitude')
    ax.set_ylabel('Latitude')
    ax.set_title('')  # 清除标题
    
    # 添加标题在图片正下方
    # fig.suptitle('{}hPa {}'.format( level_hPa,time.replace("T"," ") ), y=-0.01,va='bottom')
    
    # 调整布局以避免重叠和裁剪
    fig.tight_layout()
    
    plt.savefig("./{}hPa {}.jpg".format( level_hPa,time.replace(":","") ), dpi=500)
    plt.show()

水汽通量图

# 加载shapefile
gdf = gpd.read_file(r'./shp/Pronvience.shp')

# 载入数据
data_path = r'./20170731_case.nc'  # 替换为您的文件路径
ds = xr.open_dataset(data_path)

time = '2017-07-30T22:00:00'
for level_hPa in [200,500,600,700,850]:
    # 选择特定时间和气压层
    ds_selected = ds.sel(time= time, level=level_hPa)  # 示例:2022年1月1日0时,850hPa
    
    # 获取数据变量
    u = ds_selected['u']  # 东西向风速
    v = ds_selected['v']  # 南北向风速
    q = ds_selected['q']  # 比湿
    
    # 获取经度和纬度,假设这些是坐标维度
    longitude = u.longitude
    latitude = u.latitude
    
    # 计算水汽通量
    qu = q * u * 100  # 东西向水汽通量
    qv = q * v * 100 # 南北向水汽通量
    
    wvf = np.sqrt(qu**2 + qv**2)
    
    # 计算水汽通量散度 单位为
    # div_q = (qu.differentiate('longitude') + qv.differentiate('latitude'))* 10
    
    # 打印结果
    # print(div_q)
    
    # 创建图形和轴对象
    fig, ax = plt.subplots(figsize=(6, 6),dpi=400)  # 图形尺寸为10x6英寸
    
    # 可视化散度结果
    contour = wvf.plot(add_colorbar=False, cmap="RdBu_r", vmin=0, vmax=10)  # 使用黑色线条绘制20个等级的等高线
    #
    # 在ax上绘制等高线图
    wvf.plot.contour(levels=25, colors='black',linewidths=0.6)
    # 添加颜色条
    fig.colorbar(contour, ax=ax, label='Water Vapor Flux(g/cm/s)')
    
    # 使用quiver函数需要确保数据的间隔,这里我们每隔5个点取样
    Q = ax.quiver(longitude[::5], latitude[::5], u[::5, ::5], v[::5, ::5], scale=300,color="red")
    
    # 绘制shapefile
    gdf.plot(ax=ax, color='none', edgecolor='green',linewidths=0.7)  # 无填充,黑色边界
    
    # 设置经纬度范围
    ax.set_xlim(75, 90)
    ax.set_ylim(30, 45)
    
    ax.set_xlabel('Longitude')
    ax.set_ylabel('Latitude')
    ax.set_title('')  # 清除标题
    
    # 添加标题在图片正下方
    # fig.suptitle('{}hPa {}'.format( level_hPa,time.replace("T"," ") ), y=-0.01,va='bottom')
    
    # 调整布局以避免重叠和裁剪
    fig.tight_layout()
    
    plt.savefig("./WVF_{}hPa {}.jpg".format( level_hPa,time.replace(":","") ), dpi=500)
    plt.show()

结果图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1621367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

「 网络安全常用术语解读 」软件物料清单SBOM详解

1. 概览 软件物料清单(Software Bill of Materials,SBOM)是软件成分信息的集合,SBOM文件中记录了软件产品或服务所使用组件、库、框架的清单,用于描述软件构建过程中使用的所有组件及其关系,以实现软件供应…

fatal: unable to access ‘https://github.com/alibaba/flutter_boost.git/

Git error. Command: git fetch stdout: stderr: fatal: unable to access ‘https://github.com/alibaba/flutter_boost.git/’: Failed to connect to github.com port 443 after 75005 ms: Couldn’t connect to server exit code: 128 GitHub (国际型)代码 分发平台/托管平…

人工智能中两个较为常见的评估模型性能指标(EVS、MAE)

1、解释方差(EVS) 官方社区链接:sklearn.metrics.explained_variance_score-scikit-learn中文社区 explained_variance_score是一个用于评估回归模型性能的指标,它衡量的是模型预测值与实际值之间关系的密切程度。具体来说,解释方差分数表示…

【Canvas与艺术】绘制铜质钢底24周年纪念章

【关键点】 底图的查找和多次尝试、文字描边。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使用HTML5/Canvas绘…

图像处理的基本操作

一、PyCharm中安装OpenCV模块 二、读取图像 1、基本语法 OpenCV提供了用于读取图像的imread()方法&#xff0c;其语法如下&#xff1a; image cv2.imread&#xff08;filename&#xff0c;flags&#xff09; &#xff08;1&#xff09;image&#xff1a;是imread方法的返回…

OpenCompass 大模型评测实战——笔记

OpenCompass 大模型评测实战——笔记 一、评测1.1、为什么要做评测1.2、如何通过能力评测促进模型发展1.2.1、面向未来拓展能力维度1.2.2、扎根通用能力1.2.3、高质量1.2.4、性能评测 1.3、评测的挑战1.3.1、全面性1.3.2、评测成本1.3.3、数据污染1.3.4、鲁棒性 二、OpenCompas…

MSE实现全链路灰度实践

技术架构包括以下基础设施和云服务&#xff1a; 1个地域&#xff1a;ACK集群、微服务应用、MSE实例均部署在同一地域下。 1个专有网络VPC&#xff1a;形成云上私有网络&#xff0c;确保核心云资源的网络环境&#xff0c;如容器服务ACK、微服务引擎MSE。 ACK集群&#xff1a;简单…

开曼群岛:Web3企业的乐园

开曼群岛&#xff1a;Web3企业的理想之地 开曼群岛&#xff0c;在数字革命中大放异彩。近年来&#xff0c;该地区成立的Web3企业数量显著增加&#xff0c;如果保持目前的发展速度&#xff0c;并持续优化立法&#xff0c;那么扩展的速度将无可限量。本文将探讨推动这一增长的关…

STL-vector的使用及其模拟实现

在C中&#xff0c;vector是标准模板库&#xff08;STL&#xff09;中的一种动态数组容器&#xff0c;它可以存储任意类型的元素&#xff0c;并且能够自动调整大小。vector提供了许多方便的成员函数&#xff0c;使得对数组的操作更加简单和高效。 vector的使用 vector的构造函数…

国密SSL证书在等保、关保、密评合规建设中的应用

在等保、关保、密评等合规建设中&#xff0c;网络和通信安全方面的建设是非常重要的部分&#xff0c;需要实现加密保护和安全认证&#xff0c;确保传输数据机密性、完整性以及通信主体可信认证。国密SSL证书应用于等保、关保和密评合规建设中&#xff0c;不仅能够提升网络信息系…

创建第一个Vue3项目时遇到的报错及处理

其实主要就是针对命令&#xff1a;npm init vuelatest 的报错处理 受限自己电脑本身已经安装了node&#xff0c;npm&#xff0c;在环境搭建时&#xff0c;遇到了报错&#xff0c;如下&#xff1a; 我以为是这是个很简单的问题&#xff0c;看起来是npm的版本过低&#xff0c;升…

测试用例设计方法-探索性测试

生活犹如骑单车&#xff0c;唯有前进才能保持平衡。大家好&#xff0c;今天给大家分享一下关于探索性测试的方法&#xff0c;在探索性测试中更加考验测试人员的经验&#xff0c;所以我们在平时的测试工作中一定要多记录、多总结、多复盘&#xff0c;对于经常出现的bug深究其根本…

找对方法,单位信息宣传工作向媒体投稿其实也简单

曾经,作为一名肩负单位信息宣传重任的我,每当面对那堆叠如山的稿件与闪烁不定的电脑屏幕,心中总会涌起一股无尽的焦虑与疲惫。尤其在向媒体投稿这个环节,我仿佛陷入了一个难以挣脱的漩涡,邮箱投稿的艰辛、审核的严苛、出稿的迟缓以及成功发表的少之又少,如同一座座无形的大山压…

SpringBoot整合阿里云实现图片的上传管理

唠嗑部分 各位小伙伴大家好&#xff0c;我是全栈小白&#xff0c;之前我们分享了一期SpringBoot如何整合七牛云存储实现图片的上传与存储&#xff0c;今天我们接着分享一下SpringBoot整合阿里云OSS实现图片的上传与存储 言归正传 一、阿里云账号注册 阿里云OSS文件存储是免…

一键生成数据库文档,从此告别人工整理文档

背景 在我们日常开发过程中&#xff0c;常常遇到项目需要出一个数据库文档&#xff0c;面对数据表众多的场景一个一个写显然不现实&#xff0c;于是 screw工具很好的满足了我们的需求&#xff0c;从此告别人工整理文档; screw工具它可以将整个数据库的表输出为数据库表结构文档…

【Java--数据结构】提升数据处理速度!深入理解Java中的顺序表机制

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 两种创建顺序表的方法及区别 认识ArrayList的构造方法 不带参数的构造方法 带参数的构造方法 利用Collection 构造方法 举例 ArrayList 常用方法演示 add addAll remo…

实战技巧:Android 14适配从挂号到出院

公众号「稀有猿诉」 原文链接 实战技巧&#xff1a;Android 14适配从挂号到出院 啥&#xff1f;这都4202年了&#xff0c;你的应用还没有升级到targetSDK 34&#xff1f;莫慌&#xff0c;本文就带着你全面的了解升级targetSDK 34的方法以及避坑指南。 注意&#xff0c;A…

基于SpringBoot+Vue网上商城系统的设计与实现

系统介绍 随着社会的不断进步与发展&#xff0c;人们经济水平也不断的提高&#xff0c;于是对各行各业需求也越来越高。特别是从2019年新型冠状病毒爆发以来&#xff0c;利用计算机网络来处理各行业事务这一概念更深入人心&#xff0c;由于用户工作繁忙的原因&#xff0c;去商…

《看漫画学C++》背后的故事1:艺术与科技的结合

引言&#xff1a; 在数字化浪潮中&#xff0c;艺术与科技的结合催生了无数创新。《看漫画学C》正是这一跨界合作的产物&#xff0c;它不仅是一本编程书籍&#xff0c;更是艺术与科技融合的典范。 一、相遇&#xff1a; 科技与艺术的火花作为一名专注于技术的软件程序员&…

【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

欢迎来到CILMY23的博客 本篇主题为&#xff1a; Python函数的黑魔法&#xff1a;递归&#xff0c;嵌套函数与装饰器 个人主页&#xff1a;CILMY23-CSDN博客 系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 感谢观看&#xff0c;支持的可以给个一键三连&#xff…