什么学校气象学能和清华并列第一?通过气象小项目带大家爱上Python!【大家都追逐过春风吧?但有人追逐过台风吗!!!?今天我就带大家来追逐台风卡努!】((一)图像处理 )

  欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力

对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426@qq.com 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。

    专栏:

文章概述:通过数据集绘制我们追踪台风的视频每一帧图片

关键词:EAR5  台风卡努

本文目录

项目目的:

第一部分:

操作步骤:

1~6 登录ERA5网站

7.准备工作已完成,现在可以开始下载数据了。

8.数据下载好了之后,我们就要开始整合这两个数据了

1. 安装所需的Python库(如果尚未安装):

2. 编写并运行以下Python脚本:

3.运行此脚本

4.导入以下Python库文件

详细安装步骤请参考我的另一篇博文:

9.下面我们就来对数据进行处理

1. 导入所需的库

2. 打开NetCDF文件

3. 读取海平面气压数据

4. 提取经度和纬度信息

5. 提取时间变量

10. 读取天气图标

1.读取天气图标 替换为自己的保存路径

2. 设置图标缩放比例

3. 设置矩形框的宽度和高度

4. 设置线条颜色

5.替换成自己的保存地址

11.寻找最低点:

1. 定义寻找最低点的函数

2. 定义在3x3网格内寻找下一个最低点的函数

3. 在第一个时间步上找到初始最低点

4. 遍历每个时间步,更新最低点的位置

12.然后我们来创建图片的格式

1. 创建图形和子图

2. 添加地图特征

3. 设置地图范围

13.绘制气压场

1. 创建等值线填充图

14.添加台风标记

1.标记最低点

2. 添加白圆点

3.绘制竖直线

4.添加矩形和图标

5. 图标和文本

6. 添加色标和标题

7.生成的图片的保存格式和路径

8.关闭图表

15.关闭数据集

16.最后直接运行程序

项目结果

完整代码和数据集点赞关注后即可获


项目目的:

通过向国际气象网站申请台风卡努活动时间段的全球海平面气压值的数据集,通过代码将数据集生成一系列图片,再将图片合成视频,我们就可追踪台风的轨迹

由于项目较大,我将分为两篇博文来写,第一篇写第一部分生成图片,

第二篇写第二部分合成视频合成视频&最终结果展示

第一部分:

操作步骤:

1~6 登录ERA5网站

首先还是经典的获取气象数据集的方法

不会的或者还没有登录过的小伙伴可以参考我之前的一篇博文:

注册并登录ERA5

7.准备工作已完成,现在可以开始下载数据了。

打开

Copernicus Climate Data Store | Copernicus Climate Data Store

地址下载ERA5 hourly data on single levels from 1940 to present 页面,

勾选Mean sea level pressure

勾选2023

勾选月份和日期和时间(由于只能每次选一个月份),我们需要申请两次,后面再将两个数据集合并成一个大的数据集

勾选台风的大致辐射范围

勾选格式,我们选择

点击show API

并复制代码

在pycharm里创建一个下载文件test0628.py 然后将这段代码粘贴到里面,并修改下载后的文件名字

然后运行

注意:会需要等待

大概要几个小时,如果大家不愿意等的话,可以直接点赞关注我,在文章末尾的连接中获取相应源码及数据集

下载好了一个

接下来我们仿照上面的步骤,只需要将7月改为8月,将天数改为1~10

再次获取下载资源的代码,并放在pycharm里运行

记得仿照前面将文件名改成如下的名字,否则文件会被覆盖!!!

下载好了

8.数据下载好了之后,我们就要开始整合这两个数据了

要将两个NetCDF文件(`download_mean_sea_pressure_202307.nc`和`download_mean_sea_pressure_202308.nc`)合并成一个文件(`mean_sea_level_pressure.nc`)

使用Python编程语言中的`xarray`库。

1. 安装所需的Python库(如果尚未安装):

pip install xarray netCDF4

2. 编写并运行以下Python脚本:

 import xarray as xr

    # 打开两个NetCDF文件
    ds1 = xr.open_dataset('download_mean_sea_pressure_202307.nc')
    ds2 = xr.open_dataset('download_mean_sea_pressure_202308.nc')

    # 合并数据集
    combined_ds = xr.concat([ds1, ds2], dim='time')

    # 保存合并后的数据集到一个新的文件
    combined_ds.to_netcdf('mean_sea_level_pressure.nc')

    print("合并完成,保存为mean_sea_level_pressure.nc")

- 使用`xr.open_dataset`函数打开两个NetCDF文件。

- 使用`xr.concat`函数沿时间维度(`time`)将两个数据集合并。

- 使用`to_netcdf`函数将合并后的数据集保存为新的NetCDF文件。

3.运行此脚本

将得到一个名为`mean_sea_level_pressure.nc`的合并数据集。

4.导入以下Python库文件

然后我们需要导入以下Python库文件来辅助我们绘制数据对应的图片

import netCDF4 as nc
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from matplotlib.patches import Rectangle, Circle
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import os
import matplotlib

凡是没有下载对应库文件的,都会在对应的库文件下画浪线

这个时候我们就要通过pip 或者conda 来下载

详细安装步骤请参考我的另一篇博文:

下载Miniconda运行环境Conda虚拟环境创建与Python模块安装(pip/conda)

这个时候我们项目所需的数据集和对应的库文件已经下载好了

9.下面我们就来对数据进行处理

1. 导入所需的库

首先,代码导入了必要的库,并设置了Matplotlib的后端。

# 设置Matplotlib使用TkAgg后端

matplotlib.use('TkAgg') 

netCDF4`用于处理NetCDF文件,`matplotlib.pyplot`和`numpy`分别用于绘图和数值计算。

2. 打开NetCDF文件

# 打开 NetCDF 文件 替换为自己的保存路径

dataset = nc.Dataset('C:/Users/Mayn/Desktop/台风实验/台风实验/mean_sea_level_pressure.nc', 'r')

这行代码使用`netCDF4`库的`Dataset`函数以只读模式打开指定路径的NetCDF文件。

3. 读取海平面气压数据

# 读取海平面气压数据

seapress = dataset.variables['msl'][:]
seapress = seapress / 100  # 转换为百帕

这段代码从打开的NetCDF文件中读取海平面气压数据变量`msl`。然后将其单位从帕斯卡(Pa)转换为百帕(hPa)。

4. 提取经度和纬度信息

# 提取经度和纬度信息

lons = dataset.variables['longitude'][:]
lats = dataset.variables['latitude'][:]

这段代码分别提取NetCDF文件中存储的经度(`longitude`)和纬度(`latitude`)信息。

5. 提取时间变量

# 提取时间变量

times = dataset.variables['time'][:]
time_units = dataset.variables['time'].units
calendar = dataset.variables['time'].calendar if hasattr(dataset.variables['time'], 'calendar') else 'standard'
time_vals = nc.num2date(times, units=time_units, calendar=calendar)

这部分代码提取时间变量并将其转换为人类可读的日期时间格式。具体步骤如下:

- `times = dataset.variables['time'][:]` 提取时间变量的数值。

- `time_units = dataset.variables['time'].units` 获取时间变量的单位(例如“小时自1970-01-01起”)。

关键是这句的逻辑:

calendar = dataset.variables['time'].calendar if hasattr(dataset.variables['time'], 'calendar') else 'standard'

- 检查时间变量是否具有日历属性,如果没有则使用默认的标准日历。

- `nc.num2date`函数将时间数值转换为日期时间对象。

解释各变量的作用

- `dataset`:NetCDF文件对象,用于访问文件中的数据和元数据。

- `seapress`:海平面气压数据,已转换为百帕单位。

- `lons` 和 `lats`:经度和纬度数据,用于地理定位。

- `times`:原始时间数值。

- `time_units`:时间单位信息。

- `calendar`:时间变量的日历属性。

- `time_vals`:转换后的日期时间对象,便于分析和绘图。

10. 读取天气图标

因为要对图像美化,我们会用这个图片来标注

作为台风位置的标注,结果图如下

下面我们来实现一下

1.读取天气图标 替换为自己的保存路径

weather_icon_path = 'C:/Users/Mayn/Desktop/台风实验/台风实验/panel.png'
icon_img = plt.imread(weather_icon_path)

这部分代码使用Matplotlib的`imread`函数从指定路径读取天气图标图像文件。`weather_icon_path`是图标的文件路径,`icon_img`则是读取后的图像数据。

2. 设置图标缩放比例

icon_zoom = 0.030

这行代码定义了图标缩放比例,`icon_zoom`设置为0.030,表示图标在绘图时会按该比例进行缩放。

3. 设置矩形框的宽度和高度

rect_width = 14
rect_height = 2.5

这两行代码定义了矩形框的宽度和高度,分别为14和2.5。这些值可能用于在绘图中创建一个矩形区域,用于放置图标或其他信息。

4. 设置线条颜色

line_color = (68 / 255, 65 / 255, 65 / 255, 0.84)

这行代码定义了线条颜色,`line_color`是一个RGBA颜色值。RGBA表示红(Red)、绿(Green)、蓝(Blue)和透明度(Alpha)。在这里:

- 红色分量:68 / 255 ≈ 0.267

- 绿色分量:65 / 255 ≈ 0.255

- 蓝色分量:65 / 255 ≈ 0.255

- 透明度:0.84

颜色被归一化为0到1之间的值。这个颜色值定义了一种深灰色,带有84%的不透明度。

5.替换成自己的保存地址

# 确保目录存在  替换为自己的保存路径
save_dir = 'C:/Users/Mayn/Desktop/台风实验/台风实验/image'
if not os.path.exists(save_dir):
    os.makedirs(save_dir)

11.寻找最低点:

寻找最低点(低压中心)在气象分析中非常重要,尤其是在台风、飓风和气旋等天气现象的研究和预测中。以下是一些原因:

1. 台风和气旋的核心特征

台风、飓风和气旋等天气现象的核心特征是低压中心。通过找到海平面气压场中的最低点,气象学家可以确定这些天气系统的中心位置。

2. 追踪和预测路径

通过跟踪低压中心的位置变化,气象学家可以绘制出台风或气旋的路径。这对于预测未来的路径和可能的影响区域至关重要。

3. 研究强度变化

低压中心的气压值可以提供有关天气系统强度的重要信息。较低的气压通常表明系统更强,通过监测气压的变化,气象学家可以研究和预测台风或气旋的强度变化。

4. 辅助灾害应对

准确定位低压中心有助于发布预警和规划应急措施,从而减少台风、飓风和气旋对生命财产的威胁。

创建寻找最低点的函数:

代码主要分为以下几个部分:

1. 定义寻找最低点的函数。

2. 定义在3x3网格内寻找下一个最低点的函数。

3. 在第一个时间步上找到初始最低点。

4. 遍历每个时间步,更新最低点的位置。

1. 定义寻找最低点的函数

min_val = np.min(msl_data)
min_idx = np.unravel_index(np.argmin(msl_data), msl_data.shape)
return min_val, min_idx

这个函数的作用是找到给定海平面气压数据(`msl_data`)中的最低点:

- `min_val = np.min(msl_data)`:找到数据中的最小值。

- `min_idx = np.unravel_index(np.argmin(msl_data), msl_data.shape)`:找到最小值的索引,并将其转换为多维索引。

下面我来对这句代码进行详细的解释:

这句代码是用来找到一个二维数组 `msl_data` 中最小值的位置,并将这个位置转换为数组的索引。

1.`np.argmin(msl_data)`

`np.argmin(msl_data)` 返回数组 `msl_data` 中最小值的扁平索引(flat index)。扁平索引是将多维数组视为一维数组时元素的位置。

例如,对于一个3x3的二维数组:

[[1, 2, 3],

[4, 5, 6],

[7, 8, 9]]

这个数组的扁平索引如下:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

如果 `msl_data` 的最小值在位置 (2, 1)(即值为8的位置),则 `np.argmin(msl_data)` 会返回扁平索引 7,因为这是将二维数组展平为一维数组后8的位置。

2. `np.unravel_index(np.argmin(msl_data), msl_data.shape)`

`np.unravel_index` 将扁平索引转换为多维索引。函数的第一个参数是扁平索引,第二个参数是原始数组的形状(`msl_data.shape`)。

假设 `msl_data` 的形状为 (3, 3),`np.argmin(msl_data)` 返回 7,那么 `np.unravel_index(7, (3, 3))` 将返回 (2, 1),这是最小值在二维数组中的位置。

2. 定义在3x3网格内寻找下一个最低点的函数

def find_min_in_3x3_region(msl_data, center_idx):
    x, y = center_idx
    # 确保搜索范围在数据范围内
    x_min = max(0, x - 1)
    x_max = min(msl_data.shape[0] - 1, x + 1)
    y_min = max(0, y - 1)
    y_max = min(msl_data.shape[1] - 1, y + 1)

    # 提取3x3区域并找到最小点
    sub_region = msl_data[x_min:x_max + 1, y_min:y_max + 1]
    min_val = np.min(sub_region)
    min_idx = np.unravel_index(np.argmin(sub_region), sub_region.shape)

    # 返回在原始数据中的实际索引
    return min_val, (x_min + min_idx[0], y_min + min_idx[1])

这个函数的作用是在给定索引(`center_idx`)的3x3网格区域内找到最低点:

- `x, y = center_idx`:获取中心索引。

- `x_min = max(0, x - 1)`和`x_max = min(msl_data.shape[0] - 1, x + 1)`:确保搜索范围在数据范围内。

- `sub_region = msl_data[x_min:x_max + 1, y_min:y_max + 1]`:提取3x3区域。

- `min_val = np.min(sub_region)`:找到3x3区域中的最小值。

- `min_idx = np.unravel_index(np.argmin(sub_region), sub_region.shape)`:找到最小值的索引。

- 返回最低点的实际索引:`(x_min + min_idx[0], y_min + min_idx[1])`。

这里我将对

    x_min = max(0, x - 1)
    x_max = min(msl_data.shape[0] - 1, x + 1)

这两个语句进行详细解释:

1. `x_min = max(0, x - 1)`

- `x - 1`:计算中心点 `x` 左边的索引。如果中心点在边界处(例如 `x=0`),`x - 1` 会变成负值,这是不合法的数组索引。

- `max(0, x - 1)`:确保 `x_min` 不会小于0。即使 `x - 1` 是负值,`max` 函数会将其限制在0以上。

- 如果 `x = 1`,那么 `x - 1 = 0`,所以 `x_min = max(0, 0) = 0`。

- 如果 `x = 0`,那么 `x - 1 = -1`,所以 `x_min = max(0, -1) = 0`。

2. `x_max = min(msl_data.shape[0] - 1, x + 1)`

- `x + 1`:计算中心点 `x` 右边的索引。如果中心点在右边界处(例如 `x` 已经是数组的最后一个索引),`x + 1` 会超出数组边界。

- `msl_data.shape[0] - 1`:这是数组在第一维度上的最大合法索引,即数组的最后一个索引。

- `min(msl_data.shape[0] - 1, x + 1)`:确保 `x_max` 不会超出数组的边界。即使 `x + 1` 超出边界,`min` 函数会将其限制在数组的最后一个索引之内。

- 如果 `x = 2` 且 `msl_data.shape[0] = 3`,那么 `x + 1 = 3`,所以 `x_max = min(2, 3) = 2`。

- 如果 `x = 1` 且 `msl_data.shape[0] = 3`,那么 `x + 1 = 2`,所以 `x_max = min(2, 2) = 2`。

这段代码的显示图大概是这个样子

我用电脑鼠标画的,图片有点滑稽,哈哈哈,但能看出这段代码的逻辑,创建了一个3*3的矩行

3. 在第一个时间步上找到初始最低点

seapress_2d_0 = seapress[0, :, :]
initial_min_val, initial_min_idx = detect_low_pressure_center(seapress_2d_0)

# 记录当前最低点位置
current_min_idx = initial_min_idx

这里,代码提取第一个时间步的海平面气压数据(`seapress_2d_0`),并找到初始最低点位置(`initial_min_val, initial_min_idx`),然后将其记录为当前最低点位置(`current_min_idx`)。

下面我将对这句

seapress_2d_0 = seapress[0, :, :] 

代码进行详细的讲解

这行代码的作用是从三维数组 `seapress` 中提取第一个时间步的二维海平面气压数据。具体解释如下:

`seapress` 是一个三维数组,其维度表示为 `[time, latitude, longitude]`。每个时间步都有一个对应的二维海平面气压数据。

- `seapress[0, :, :]`:表示从 `seapress` 中提取第一个时间步的数据。

- `0`:索引 `0` 表示第一个时间步。

- `:`:表示选择所有纬度。

- `:`:表示选择所有经度。

这样,`seapress[0, :, :]` 返回一个二维数组,包含第一个时间步的所有纬度和经度上的气压数据。

举例说明:

假设 `seapress` 的形状为 `(10, 100, 200)`,表示有10个时间步,每个时间步有一个 `100x200` 的气压数据网格:

- `seapress` 的维度解释为:

- `10`:时间步的数量。

- `100`:纬度的数量。

- `200`:经度的数量。

- `seapress[0, :, :]`:提取第一个时间步的数据。

- `seapress_2d_0`:结果是一个形状为 `(100, 200)` 的二维数组,表示第一个时间步在所有纬度和经度上的气压数据。

在气象数据处理中,时间步通常代表不同的时间点。提取特定时间步的数据可以用于分析某一特定时刻的气象状况,如某一时刻的海平面气压分布。这对研究天气系统的演变和进行天气预报非常重要。

4. 遍历每个时间步,更新最低点的位置

for t in range(len(times)):
    # 提取当前时间步的2D数据
    seapress_2d = seapress[t, :, :]

    # 使用3x3网格找到最低点
    min_val, min_idx = find_min_in_3x3_region(seapress_2d, current_min_idx)

    # 更新当前最低点的位置
    current_min_idx = min_idx

在这个循环中,代码遍历每个时间步:

- `seapress_2d = seapress[t, :, :]`:提取当前时间步的2D气压数据。

- `min_val, min_idx = find_min_in_3x3_region(seapress_2d, current_min_idx)`:使用3x3网格找到当前时间步的最低点。

- `current_min_idx = min_idx`:更新当前最低点的位置。

12.然后我们来创建图片的格式

1. 创建图形和子图

fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())

- `plt.figure(figsize=(10, 6))`:创建一个新的图形窗口,大小为宽度10英寸,高度6英寸。

- `fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())`:向图形中添加一个子图,并指定使用地理投影 `ccrs.PlateCarree()`。这里的参数 `(1, 1, 1)` 表示在一个1x1的网格中创建第一个子图。

2. 添加地图特征

ax.coastlines()
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.OCEAN)

- `ax.coastlines()`:在地图上绘制海岸线。

- `ax.add_feature(cfeature.LAND)`:添加陆地特征。

- `ax.add_feature(cfeature.OCEAN)`:添加海洋特征。

这些方法用于在地图上添加基本的地理特征,以提供背景和参考。

3. 设置地图范围

ax.set_extent([100, 150, 0, 50], ccrs.PlateCarree())

- `ax.set_extent([100, 150, 0, 50], ccrs.PlateCarree())`:设置地图显示的范围,指定经度和纬度的范围。这里的参数 `[100, 150, 0, 50]` 表示经度范围从100到150度,纬度范围从0到50度。

- `ccrs.PlateCarree()`:指定地理投影为 Plate Carrée 投影,这是一种简单的等经纬度网格投影。

也许你会对这段代码有些疑惑

ax.set_extent([100, 150, 0, 50], ccrs.PlateCarree())

这行代码的作用是设置地图显示的范围,而不是改变图形的大小。

- `ax.set_extent([100, 150, 0, 50], ccrs.PlateCarree())`:这行代码指定了地图在地理坐标系统(Plate Carrée投影)下的显示范围。

- `[100, 150, 0, 50]`:这个参数是一个列表,其中包含四个值,分别是 `[经度最小值, 经度最大值, 纬度最小值, 纬度最大值]`。在这个例子中,经度范围从100到150度,纬度范围从0到50度。

所以前面我们获取的是全球的数据,在这里我们通过地理投影,来获取这一块的海平面气压数据,可以参考下面的台风范围图

- `ccrs.PlateCarree()`:指定了地图的投影方式为Plate Carrée投影,这是一种简单的等经纬度网格投影方式。

图形大小的修改:

- 图形的大小是通过 `plt.figure(figsize=(宽度, 高度))` 来控制的。在你的代码中,使用了 `plt.figure(figsize=(10, 6))`,这表示创建一个宽度为10英寸、高度为6英寸的图形窗口。

因此,`ax.set_extent([100, 150, 0, 50], ccrs.PlateCarree())` 这段代码没有改变图形的大小,而是指定了地图显示的经纬度范围。

可以参考这张图理解这个  ax.set_extent([100, 150, 0, 50], ccrs.PlateCarree())  

13.绘制气压场

用于绘制海平面气压场的等值线填充图。

1. 创建等值线填充图

# 绘制气压场
levels = np.linspace(np.min(seapress), np.max(seapress), 100)
seapress_plot = ax.contourf(lons, lats, seapress_2d, levels=levels, cmap='jet',
                            transform=ccrs.PlateCarree())

- `levels = np.linspace(np.min(seapress), np.max(seapress), 100)`:

- `np.min(seapress)` 和 `np.max(seapress)` 分别是海平面气压数据 `seapress` 的最小值和最大值。

- `np.linspace(np.min(seapress), np.max(seapress), 100)` 创建了一个包含100个值的等间隔数组,用作等值线的水平分布。

- `ax.contourf(lons, lats, seapress_2d, levels=levels, cmap='jet', transform=ccrs.PlateCarree())`:

- `ax.contourf` 是 matplotlib 中用于绘制等值线填充图的函数。

- `lons` 和 `lats` 分别是经度和纬度的数组,用来指定数据在地理坐标系中的位置。

- `seapress_2d` 是二维数组,包含了特定时间步的海平面气压数据。

- `levels=levels` 指定了等值线的水平分布。

- `cmap='jet'` 指定了填充颜色映射为 'jet',这是一种彩虹色的颜色映射,用于显示气压场的不同值。

- `transform=ccrs.PlateCarree()` 指定了数据的投影方式为 Plate Carrée,确保数据正确地显示在地理坐标系上。

作用:

将当前时间步的海平面气压数据 `seapress_2d` 绘制为一个等值线填充图,显示了不同经纬度上的气压分布情况。填充图的颜色根据气压值的高低而变化,帮助用户快速识别出气压的分布模式和强度。这种可视化方式非常常用于气象数据分析和气象预报中。

14.添加台风标记

1.标记最低点

min_lat = lats[min_idx[0]]
min_lon = lons[min_idx[1]]

这两行代码从`lats`和`lons`数组中提取最低点的经纬度坐标。`min_idx`是最低点的索引,`min_idx[0]`和`min_idx[1]`分别对应于纬度和经度的索引。

2. 添加白圆点

white_circle = Circle((min_lon, min_lat), radius=0.2, color='white',
                      transform=ccrs.PlateCarree(), zorder=10)
ax.add_patch(white_circle)

创建了一个白色的小圆圈,以标记最低点的位置。圆圈可以用来标记或强调地图上的重要

1. **`Circle` 类**:这是从 `matplotlib.patches` 模块导入的一个类,用于创建圆形补丁对象。

2. **参数解释**:

- **`(min_lon, min_lat)`**:这是圆心的坐标。

- `min_lon` 是圆心的经度。

- `min_lat` 是圆心的纬度。

- **`radius=0.2`**:圆圈的半径为 `0.2`。具体的单位取决于绘图的上下文,在地理坐标系中通常是度。

- **`color='white'`**:设置圆圈的颜色为白色。

- **`transform=ccrs.PlateCarree()`**:指定坐标系变换为 `PlateCarree`,它是一种用于绘制地图的投影方法,确保圆圈在地图上的位置正确。`ccrs` 是 `cartopy.crs` 的别名,表示 Cartopy 的坐标参考系统。

- **`zorder=10`**:设置绘制顺序为10,表示圆圈将绘制在大多数其他元素之上。较大的 `zorder` 值会让对象绘制在前面。

3.绘制竖直线

ax.plot([min_lon, min_lon], [min_lat, min_lat + 5], color=line_color, linewidth=2,
        transform=ccrs.PlateCarree())

这行代码绘制了一条竖直线,从最低点开始并向上延伸5个单位。`line_color`是线的颜色,`linewidth`设置了线的宽度。

4.添加矩形和图标

rect_top = min_lat + 5
rect_mid = rect_top + rect_height / 2
flag_rect = Rectangle((min_lon, rect_top), rect_width, rect_height, color=line_color, zorder=6,transform=ccrs.PlateCarree())
ax.add_patch(flag_rect)

这里定义了一个矩形,其顶部位于竖直线的顶端,矩形的高度由`rect_height`决定。`rect_mid`是矩形的中点,用于稍后放置图标和文本。`Rectangle`对象表示矩形,`zorder=6`表示绘制顺序。

5. 图标和文本

icon = OffsetImage(icon_img, zoom=icon_zoom)
icon_box = AnnotationBbox(icon, (min_lon + rect_width / 12 + 0.5, rect_mid), frameon=False,transform=ccrs.PlateCarree(), pad=0, zorder=10)
ax.add_artist(icon_box)

这段代码在矩形上添加一个图标。`OffsetImage`创建了图标图像对象,`zoom`设置图标的缩放比例。`AnnotationBbox`将图标放置在矩形的中点,`frameon=False`表示没有边框。

ax.text(min_lon + rect_width / 2 + 1.5, rect_mid,
        f'{min_val:.1f} hPa', verticalalignment='center', horizontalalignment='center', fontsize=12,
        weight='bold', color='white', transform=ccrs.PlateCarree(), zorder=10)

这行代码在矩形旁边添加一个文本注释,显示最低点的数值。`min_val`是最低值,格式化为一位小数。`verticalalignment`和`horizontalalignment`设置文本的对齐方式,`fontsize`设置字体大小,`weight`设置字体粗细,`color`设置字体颜色。

1. **`Rectangle` 类**:这是从 `matplotlib.patches` 模块导入的一个类,用于创建矩形对象。

2. **参数解释**:

- **`(min_lon, rect_top)`**:这个元组 `(min_lon, rect_top)` 指定了矩形左下角的坐标。

- `min_lon` 是矩形左下角的经度。

- `rect_top` 是矩形左下角的纬度,它被定义为最低点的纬度加上一个偏移量 `5`,以将矩形置于竖直线的顶部。

- **`rect_width`**:矩形的宽度。

- **`rect_height`**:矩形的高度。

- **`color=line_color`**:设置矩形的颜色为 `line_color`。

- **`zorder=6`**:设置矩形的绘制顺序(z-order),`6` 表示这个矩形将会绘制在一些其他元素之前或之后,取决于其他元素的 `zorder` 值。较大的 `zorder` 值会让对象绘制在前面。

6. 添加色标和标题

cbar = plt.colorbar(seapress_plot, ax=ax, label='Press (hPa)')

这行代码添加了一个色标,用于显示海平面气压图(`seapress_plot`)的数值范围。`label`设置色标的标签。

time_str = time_vals[t].strftime("%Y-%m-%d %H:%M")
plt.title(f'Sea Level Pressure on {time_str}')

这段代码设置图表的标题,显示绘图的时间。`time_vals[t]`是当前时间步的时间值,使用`strftime`格式化为字符串。

7.生成的图片的保存格式和路径

filename = os.path.join(save_dir, f'seapress_{t}.png')
plt.savefig(filename, bbox_inches='tight')

8.关闭图表

这两行代码生成保存文件的文件名,并将图表保存为PNG文件。`bbox_inches='tight'`确保图表的边界紧密围绕图表内容。

plt.close(fig)

这行代码关闭当前图表,以释放内存并避免干扰后续绘图。

15.关闭数据集

dataset.close()

关闭已经打开的数据集文件。使用库如 netCDF4 来操作数据集文件,在完成数据读取或处理后,显式地关闭文件,以释放资源,避免文件句柄泄漏。

16.最后直接运行程序

就可以开始下载我们最终所需的视频每一帧的图片了

项目结果

第一部分:

完整代码和数据集点赞关注后即可获取:

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当面对不同气象条件时,我们可以采用一些实用的应对策略和建议,以更好地学习。以下是一些具体的建议: 1. 创造适合学习的环境:确保学习环境舒适、安静且有足够的光线。在阴雨天气下,可以使用柔和的灯光来增加室内亮度,让学习环境更加明亮和舒适。 2. 制定明确的计划:制定一个明确的学习计划,将学习任务分解为小的可管理的部分,并为每个部分设定明确的时间段。这样有助于提高学习效率和时间管理能力。 3. 使用时间管理技巧:采用番茄钟法(Pomodoro Technique)等时间管理技巧,将学习时间划分为短期间隔,并在每个间隔结束时休息一小段时间。这种方法有助于提高注意力和集中力,并避免疲劳和厌倦。 4. 调整学习方式:根据不同气象条件,可以调整学习方式来提高学习效果。例如,在阴雨天气下,可以选择主动参与、讲解给别人听、做笔记等方式来加深对知识的理解和记忆。 5. 进行适度的身体活动:在学习过程中,进行适度的身体活动可以帮助提高血液循环和注意力。可以选择简单的伸展、散步或其他有氧运动,来恢复精力和提高专注力。 6. 寻找学习伙伴或小组:与其他人一起学习可以增加学习的乐趣和动力。与同学或朋友组成学习小组,相互讨论和分享学习经验,可以增强学习效果并互相激励。 7. 管理情绪和压力:不同气象条件下,情绪可能会有所波动。学会管理情绪和压力,可以帮助你更好地集中注意力和提高学习效果。尝试使用放松技巧,如深呼吸、冥想或与朋友交流,以缓解紧张和焦虑情绪。 这些应对策略和建议可以根据个人情况和气象条件进行灵活调整。通过合理应用这些方法,我们可以更好地适应不同气象条件下的学习环境,提高学习效果和提升学习体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值