如何使用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 相关文章推荐
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
Python基于机器学习方法实现的电影推荐系统实例详解
Jun 25 Python
python序列化与数据持久化实例详解
Dec 20 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
Feb 23 Python
python将音频进行变速的操作方法
Apr 08 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
如何基于Python和Flask编写Prometheus监控
Nov 25 Python
python实现马丁策略的实例详解
Jan 15 Python
Python爬虫后获取重定向url的两种方法
Jan 19 Python
Python实现排序方法常见的四种
Jul 15 Python
python实现简单倒计时功能
python Polars库的使用简介
python基础之匿名函数详解
Apr 21 #Python
Python基础之字符串格式化详解
Apr 21 #Python
python 自动刷新网页的两种方法
python实现Thrift服务端的方法
python基础之while循环语句的使用
You might like
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
2007/09/30 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
JavaScript原型及原型链终极详解
2016/01/04 Javascript
js实现文字滚动效果
2016/03/03 Javascript
深入理解angularjs过滤器
2016/05/25 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
几个你不知道的技巧助你写出更优雅的vue.js代码
2018/06/11 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
Python 逐行分割大txt文件的方法
2017/10/10 Python
python网络应用开发知识点浅析
2019/05/28 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
Python yield的用法实例分析
2020/03/06 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
python爬取微博评论的实例讲解
2021/01/15 Python
综合办公室个人的自我评价
2013/12/22 职场文书
生产部厂长职位说明书
2014/03/03 职场文书
献爱心标语
2014/06/21 职场文书
企业挂职心得体会
2014/09/10 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
logback 实现给变量指定默认值
2021/08/30 Java/Android