python--循环绘制ERA5风场的空间分布图

简介: 使用python封装绘图函数循环绘制ERA5风场资料的空间分布图

使用python封装绘图函数循环绘制ERA5风场资料的空间分布图



通常,在处理气象海洋资料时,经常会绘制风场的空间分布图进行简单分析,而常常需要连续绘制多天,并将多张子图绘制到同一个图片中,因此这就需要用到循环绘图。


  • 同时考虑到下载的ERA5风场资料的经度排列顺序是-180~180°,这里也简单进行了经度转换,将其转换为0 ~ 360的排列顺序。
  • 根据每个子图的数据,将选取的时间也在循环中加上
  • 考虑到绘制全球的处理时间较久,这里自由选取任意经纬度进行绘制
  • 由于每张子图的填色范围是固定的,所以统一绘制colorbar,至于图片最下端
  • 箭头为风场风量,填色为风速大小


下面附上代码:


# -*- coding: utf-8 -*-
"""
Created on %(date)s
@author: %(jixianpu)s
Email : 211311040008@hhu.edu.cn
introduction : keep learning althongh walk slowly
"""
from matplotlib.ticker import AutoMinorLocator, MultipleLocator, FuncFormatter
import numpy as np
import pandas as pd
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.ticker import LongitudeFormatter,LatitudeFormatter
import matplotlib.pyplot as plt
import xarray as xr
import glob
from scipy import signal
path=r'G:/ERA5_200406/'
str1='uwnd.200406.nc'
str2='vwnd.200406.nc'
# b, a = signal.butter(3, [(2/10)/(1/0.25),(2/3)/(1/0.25)], 'bandpass')
######===================
def make_map(ax, title):
    # set_extent  set crs
    ax.set_extent(box, crs=ccrs.PlateCarree())
    land = cfeature.NaturalEarthFeature('physical',
                                        'land',
                                        scale,
                                        edgecolor='grey', 
                                        facecolor='grey'
                                        ,zorder=2
                                        )
    ax.add_feature(land)  # set land color
    ax.coastlines(scale)  # set coastline resolution
    # set coordinate axis
    ax.set_xticks(np.arange(box[0],box[1]+xstep, xstep),crs=ccrs.PlateCarree())
    ax.set_yticks(np.arange(box[2], box[3]+ystep, ystep),crs=ccrs.PlateCarree())
    ax.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label =False))#经度0不加标识
    ax.yaxis.set_major_formatter(LatitudeFormatter())
    # plt.tick_params(labelsize=25)
    ax.set_title(title, fontsize=20, loc='left',pad=12)
    ax.yaxis.set_minor_locator(AutoMinorLocator(5))
    ax.xaxis.set_minor_locator(AutoMinorLocator(10))
    ax.tick_params(which='minor', 
                    direction='out', length=4,width=0.59,
                    right=True, top=True)
    ax.tick_params(which='major', 
                    direction='out', 
                    length=8,
                    width=0.99, 
                    pad=3, 
                    labelsize=10,
                    bottom=True, left=True, right=True, top=True)
    return ax
# # prepare 
box = [100, 180, -30, 0]  
scale = '50m'            
xstep, ystep = 20, 10 
# cmap=plt.get_cmap('RdYlBu_r')#'RdYlBu_r'
# =======================data============================================
day=(np.arange(19,31))
da = xr.open_dataset(path+str1).sortby("latitude", ascending= True)
da2=xr.open_dataset(path+str2).sortby("latitude", ascending= True)
#####################reverse################################################
lon_name = 'longitude'  # whatever name is in the data
da['longitude_adjusted'] = xr.where(da[lon_name] < 0, da[lon_name]%360,\
                      da[lon_name])
da = (
   da
   .swap_dims({lon_name: 'longitude_adjusted'})
   .sel(**{'longitude_adjusted': sorted(da.longitude_adjusted)})
   .drop(lon_name))
da = da.rename({'longitude_adjusted': lon_name})
#####################reverse################################################
lon_name = 'longitude'  # whatever name is in the data
da2['longitude_adjusted'] = xr.where(da2[lon_name] < 0, da2[lon_name]%360,\
                      da2[lon_name])
da2 = (
   da2
   .swap_dims({lon_name: 'longitude_adjusted'})
   .sel(**{'longitude_adjusted': sorted(da2.longitude_adjusted)})
   .drop(lon_name))
da2 = da2.rename({'longitude_adjusted': lon_name})
#####################reverse################################################
fig=plt.figure(figsize=(14,14))
levels=np.arange(0,21,1)
 # wspace 调整水平的
plt.subplots_adjust(hspace=0.1) 
plt.tight_layout()
count=0
for i  in day:
    count+=1
    print(count)
    tim_s='2004-06-'+str(i)+'-00'
# longitude=slice(0,181)
    u=da.u.sel(level=slice(850,850),latitude=slice(-30,0),longitude=slice(100,180),time=slice(tim_s,tim_s))[0][0]
    v=da2.v.sel(level=slice(850,850),latitude=slice(-30,0),longitude=slice(100,180),time=slice(tim_s,tim_s))[0][0]
    w=np.sqrt(u*u+v*v)
    lon=u.longitude.data
    lat=u.latitude.data
    x,y=np.meshgrid(lon,lat)
    t=u.time
    step=10
    # =======================plot============================================
    ax=fig.add_subplot(4,3,count,projection=ccrs.PlateCarree(central_longitude=180))
    make_map(ax,pd.to_datetime(t.data).strftime('%Y_%m_%d_%H:00'))
    ax.quiver(x[::step,::step],y[::step,::step],u.data[::step,::step],v.data[::step,::step],pivot='mid',\
        width=0.003,scale=200,headlength=4,headwidth=4,
        transform=ccrs.PlateCarree(),color='k',angles='xy'
        ,zorder=2)
    # ax.set_aspect('auto')
    plot=ax.contourf(x,y,w,transform=ccrs.PlateCarree(),extend='both',levels=levels
                  ,zorder=1)
# cb=fig.colorbar(plot,ax=ax,shrink=0.8,pad=0.05,aspect=15)
# cb.ax.tick_params(labelsize=20)
# cb.ax.set_title('$°C$',fontsize=20,loc='right')
# if count==6:
#     break
ax3=fig.add_axes([0.25,0.1,0.5,0.015])  # 0.25控制距离左边的距离,0.01控制距离下面的距离,最后两位控制color的长度和厚度
cb=fig.colorbar(plot,cax=ax3,shrink=0.9,pad=0.04,ticks=[0,5,10,15,20],aspect=15,orientation='horizontal')
cb.ax.tick_params(labelsize=10)
cb.ax.set_title('$m/s$',fontsize=15)
plt.show()
# fig.savefig('wind_850hpa-2004-06-19_30.png',format='png',dpi=100)


绘制结果如下图所示:


d585f665ec5243978724d2ff7f79614b.png


相关文章
|
1月前
|
开发工具 Python
[oeasy]python043_自己制作的ascii码表_循环语句_条件语句_缩进_indent
本文介绍了如何使用Python制作ASCII码表,回顾了上一次课程中`print`函数的`end`参数,并通过循环和条件语句实现每8个字符换行的功能。通过调整代码中的缩进,实现了正确的输出格式。最后展示了制作完成的ASCII码表,并预告了下一次课程的内容。
27 2
|
1月前
|
Python
在 Python 中实现各种类型的循环判断
在 Python 中实现各种类型的循环判断
33 2
|
1月前
|
Python
Python 中,循环判断
Python 中,循环判断
50 1
|
1月前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 7
本教程介绍了SciPy的空间数据处理功能,涵盖如何使用`scipy.spatial`模块进行点的位置判断、最近点计算等操作。还详细解释了距离矩阵的概念及其在生物信息学中的应用,以及汉明距离的定义和计算方法。示例代码展示了如何计算两个点之间的汉明距离。
37 1
|
1月前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
28 1
|
1月前
|
人工智能 Python
[oeasy]python039_for循环_循环遍历_循环变量
本文回顾了上一次的内容,介绍了小写和大写字母的序号范围,并通过 `range` 函数生成了 `for` 循环。重点讲解了 `range(start, stop)` 的使用方法,解释了为什么不会输出 `stop` 值,并通过示例展示了如何遍历小写和大写字母的序号。最后总结了 `range` 函数的结构和 `for` 循环的使用技巧。
38 4
|
2月前
|
Java 索引 Python
【10月更文挑战第19天】「Mac上学Python 30」基础篇11 - 高级循环技巧与应用
本篇将介绍更深入的循环应用与优化方法,重点放在高级技巧和场景实践。我们将讲解enumerate()与zip()的妙用、迭代器与生成器、并发循环以及性能优化技巧。这些内容将帮助您编写更高效、结构更合理的代码。
71 5
|
1月前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
34 0
|
2月前
|
Python
Python 循环语句的高级应用与深度探索
本文深入探讨了Python中循环语句的高级应用,包括`for`循环遍历字典获取键值、同步遍历多个序列,以及`while`循环结合条件判断和异常处理。通过嵌套循环实现了矩阵乘法,并介绍了如何优化循环以提升程序性能。示例代码展示了这些技术的实际应用。
53 15
|
2月前
|
数据安全/隐私保护 Python
Python循环语句
【10月更文挑战第7天】