如何使用Python对NetCDF数据做空间相关分析


Posted in Python onApril 21, 2021

引言:我一直想理解空间相关分析的计算思维,于是今天又拿起Python脚本和数据来做练习。首先需要说明的是,这次实验的数据和Python脚本均来自于[好久不见]大佬,在跟大佬说明之后,允许我写到公众号来与大家共享,在此对大佬的指点表示感谢,这次实验的脚本可在气象家园或简书app(如果没记错的话)搜索到这次实验的相关内容,也可以微信或者后台发消息给我获取。在此之前我觉得自己还没理解这个方法的计算思维,检验的标准就是我能否迅速运用到其他方面。于是今天又重新回来温习一遍,我把自己的理解与大伙共同交流。

首先,数据的格式是NetCDF(.nc)数据,两个数据分别是[哈德来中心海温sst数据,pc数据是对东太平洋SSTA做的EOF获取]。知道数据信息之后我们就准备开始去运行程序。原始脚本包括了回归分析和相关分析两部分,但是今天我做了空间相关分析这一部分,有兴趣的可以到[好久不见]大佬的气象家园阅读喔!如果还没有安装Cartopy包的话请在后台联系我喔

为了方便理解每一步,我选择去Jupyter运行,因为可以一段一段程序的运行,这是比较方便的。绘图部分并不是很难,关键还是在于数据预处理部分。

空间相关分析的脚本如下:

import numpy as np #数值计算用,如相关系数
import xarray as xr #读取.nc文件用
from sklearn.feature_selection import f_regression #做显著性检验
import matplotlib.pyplot as plt #绘制和展示图形用
import cartopy.crs as ccrs #绘制地图用,如果没有安装好的话,请在后台联系我
import cartopy.feature as cfeature #添加一些矢量用,这里没用到,因为我没数据
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter #经纬度格式设置
import cmaps #ncl的color,如果没有的话,请联系我,也可以在气象家园找到

#使用上下文管理器读取.nc数据,并提取数据中的变量,可以提前用NASA的panoply这个软件查看.nc信息
with xr.open_dataset(r'D:\inuyasha\codeX\codeLEARN\sst.DJF.mean.anom.nc') as f1:
      pre = f1['sst_anom'][:-1, :, :]  # 三维数据全取,时间,纬度+经度
      lat, lon = f1['lat'], f1['lon'] #提取经纬度,后面格网化需要用到
pre2d = np.array(pre).reshape(pre.shape[0], pre.shape[1]*pre.shape[2])
#0表示行个数,1列代表的个数,2经度代表个数
with xr.open_dataset(r'D:\inuyasha\codeX\codeLEARN\pc.DJF.sst.nc') as f2:
      pc = f2['pc'][0, :]

# 相关系数计算
pre_cor = np.corrcoef(pre2d.T, pc)[:-1, -1].reshape(len(lat), len(lon))

# 做显著性检验
pre_cor_sig = f_regression(np.nan_to_num(pre2d), pc)[1].reshape(len(lat), len(lon))#用0代替NaN
area = np.where(pre_cor_sig < 0.05)
# numpy的作用又来了 
nx, ny = np.meshgrid(lon, lat)  
# 格网化经纬度,打印出来看看就知道为什么要这么做了
plt.figure(figsize=(16, 8)) #创建一个空画布
#让colorbar字体设置为新罗马字符
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 16

ax2 = plt.subplot(projection=ccrs.PlateCarree(central_longitude=180))
# 在画布上绘图,这个叫axes,这不是坐标轴喔
ax2.coastlines(lw=0.4)
ax2.set_global()
c2 = ax2.contourf(nx, ny, pre_cor, extend='both', cmap=cmaps.nrl_sirkes, transform=ccrs.PlateCarree())
plt.colorbar(c2,fraction=0.05,orientation='horizontal', shrink=0.4, pad=0.06)
# extend关键字设置colorbar的形状,both为两端尖的,pad是距离主图的距离,其他参数web搜索

# 显著性打点
sig2 = ax2.scatter(nx[area], ny[area], marker='+', s=1, c='k', alpha=0.6, transform=ccrs.PlateCarree())
# 凸显显著性区域
plt.title('Correlation Analysis', fontdict={'family' : 'Times New Roman', 'size'   : 16})
#标题字体也修改为新罗马字符,数字和因为建议都用新罗马字符
ax2.set_xticks(np.arange(0, 361, 30),crs=ccrs.PlateCarree())
# 经度范围设置,nunpy的作用这不就又来了嘛
plt.xticks(fontproperties = 'Times New Roman',size=16) #修改xy刻度字体为新罗马字符
plt.yticks(fontproperties = 'Times New Roman',size=16)
ax2.set_yticks(np.arange(-90, 90, 15),crs=ccrs.PlateCarree())
# 设置y
ax2.xaxis.set_major_formatter(LongitudeFormatter(zero_direction_label = False))#经度0度不加东西
ax2.yaxis.set_major_formatter(LatitudeFormatter())
# 设置经纬度格式,就是多少度显示那样的,而不是一些数字
ax2.set_extent([-178, 178, -70, 70], crs=ccrs.PlateCarree())
# 设置空间范围
plt.grid(color='k')
# 画一个网格吧
plt.show()
# 显示出图形

那么就运行看看效果吧

如何使用Python对NetCDF数据做空间相关分析

如何使用Python对NetCDF数据做空间相关分析

如果觉得这个color不喜欢的话,就换一下ncl的来吧,ncl的颜色多而漂亮,喜欢啥就换啥

如何使用Python对NetCDF数据做空间相关分析

如何使用Python对NetCDF数据做空间相关分析

想要理解这个方法的计算思维,有必要观察原始数据和数据处理之后的样式,理解了数据样式之后可能更有助于我们理解整个程序

import numpy as np
import xarray as xr
from sklearn.feature_selection import f_regression
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import cmaps

with xr.open_dataset(r'D:\inuyasha\codeX\codeLEARN\sst.DJF.mean.anom.nc') as f1:
      pre = f1['sst_anom'][:-1, :, :]  # 三维数据全取,时间,纬度+经度
      lat, lon = f1['lat'], f1['lon']
pre2d = np.array(pre).reshape(pre.shape[0], pre.shape[1]*pre.shape[2])#0行代表的个数,1纬度,2经度
#pre2d.shape是一个39行,16020列的矩阵,T之后就变为了16020行,39列

with xr.open_dataset(r'D:\inuyasha\codeX\codeLEARN\pc.DJF.sst.nc') as f2:
      pc = f2['pc'][0, :]
#pc是一个39行的数组

# # 相关系数
pre_cor = np.corrcoef(pre2d.T, pc)[:-1, -1].reshape(len(lat), len(lon))
#pre_cor.shape,(16020,)->reshape(89,180)
# # 显著性检验

# pre_cor_sig = f_regression(np.nan_to_num(pre2d), pc)[1].reshape(len(lat), len(lon))#用0代替NaN
# area = np.where(pre_cor_sig < 0.05)

nx, ny = np.meshgrid(lon, lat)  # 格网化
nx,ny

如何使用Python对NetCDF数据做空间相关分析

看看格网化后的经纬度多规范啊。画张图来看看可能也会直观一些。

如何使用Python对NetCDF数据做空间相关分析

好吧,今天的分享就到这里了,理解了这个计算思维,能更好地迁移运用到其他研究方面,如果还没有安装Cartopy包的话请在后台联系我喔,如果需要测试数据和脚本请在后台联系我,当然也可以去[好久不见]大佬的主页。如果觉得这次分享不错的话,还请老铁们点个赞,多多分享,欢迎交流学习,感谢各位!

原始资料:

http://bbs.06climate.com/forum.php?mod=viewthread&tid=92816&highlight=%CF%D4%D6%F8%D0%D4%BC%EC%D1%E9%2B%CF%E0%B9%D8%B7%D6%CE%F6

以上就是如何使用Python对NetCDF数据做空间相关分析的详细内容,更多关于Python对NetCDF数据做空间分析的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
Python简明入门教程
Aug 04 Python
python实现m3u8格式转换为mp4视频格式
Feb 28 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
基于pandas数据样本行列选取的方法
Apr 20 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 Python
python快速排序的实现及运行时间比较
Nov 22 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
django之从html页面表单获取输入的数据实例
Mar 16 Python
Python几种常见算法汇总
Jun 02 Python
Python学习之异常中的finally使用详解
Mar 16 Python
python实现简单倒计时功能
python Polars库的使用简介
python基础之匿名函数详解
Apr 21 #Python
Python基础之字符串格式化详解
Apr 21 #Python
python 自动刷新网页的两种方法
python实现Thrift服务端的方法
python基础之while循环语句的使用
You might like
动漫定律:眯眯眼都是怪物!这些角色狠话不多~
2020/03/03 日漫
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
把input初始值不写value的具体实现方法
2013/07/04 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
详解JavaScript权威指南之对象
2016/09/27 Javascript
微信小程序 火车票查询实例讲解
2016/10/17 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
对vue 键盘回车事件的实例讲解
2018/08/25 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
利用Python实现手机短信监控通知的方法
2019/07/22 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
python、Matlab求定积分的实现
2019/11/20 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
文职个人求职信范文
2013/09/23 职场文书
入团者的自我评价分享
2013/12/02 职场文书
政府门卫岗位职责
2014/04/29 职场文书
和谐社区口号
2014/06/19 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
义诊活动通知
2015/04/24 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
python_tkinter事件类型详情
2022/03/20 Python
一行Python命令实现批量加水印
2022/04/07 Python