如何使用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(Tornado)模拟登录小米抢手机
Nov 12 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 Python
使用Python中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
django定期执行任务(实例讲解)
Nov 03 Python
Python实现购物车程序
Apr 16 Python
python逆序打印各位数字的方法
Jun 25 Python
Flask框架踩坑之ajax跨域请求实现
Feb 22 Python
django获取from表单multiple-select的value和id的方法
Jul 19 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
python 爬虫如何实现百度翻译
Nov 16 Python
用python批量下载apk
Dec 29 Python
pytorch中[..., 0]的用法说明
May 20 Python
python实现简单倒计时功能
python Polars库的使用简介
python基础之匿名函数详解
Apr 21 #Python
Python基础之字符串格式化详解
Apr 21 #Python
python 自动刷新网页的两种方法
python实现Thrift服务端的方法
python基础之while循环语句的使用
You might like
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
php-msf源码详解
2017/12/25 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
在Web项目中引入Jquery插件报错的完美解决方案(图解)
2016/09/19 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
快速解决vue-cli不能初始化webpack模板的问题
2018/03/20 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
[01:48]完美圣典齐天大圣至宝宣传片
2016/12/17 DOTA
Python中的闭包总结
2014/09/18 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
python读写json文件的简单实现
2017/04/11 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
儿童python练习实例
2018/05/27 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
浅析python 通⽤爬⾍和聚焦爬⾍
2020/09/28 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
Python函数调用追踪实现代码
2020/11/27 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
加拿大领先的牛仔零售商:Bluenotes
2018/01/22 全球购物
台湾旅游网站:灿星旅游
2018/10/11 全球购物
空乘英文求职信
2014/04/13 职场文书
社区活动总结报告
2014/05/05 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android