如何使用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中针对函数处理的特殊方法
Mar 06 Python
Python 异常处理实例详解
Mar 12 Python
Python import自定义模块方法
Feb 12 Python
Windows下安装python2.7及科学计算套装
Mar 05 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
python贪吃蛇游戏代码
Apr 18 Python
Python 使用指定的网卡发送HTTP请求的实例
Aug 21 Python
Python中字典与恒等运算符的用法分析
Aug 22 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
Python计算公交发车时间的完整代码
Feb 12 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 Python
python实现简单倒计时功能
python Polars库的使用简介
python基础之匿名函数详解
Apr 21 #Python
Python基础之字符串格式化详解
Apr 21 #Python
python 自动刷新网页的两种方法
python实现Thrift服务端的方法
python基础之while循环语句的使用
You might like
PHP实现的memcache环形队列类实例
2015/07/28 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
基于jquery实现的鼠标滑过按钮改变背景图片
2011/07/15 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
2015/03/04 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
JS随机打乱数组的方法小结
2016/06/22 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
如何解决React官方脚手架不支持Less的问题(小结)
2018/09/12 Javascript
vue上传图片到oss的方法示例(图片带有删除功能)
2018/09/27 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
python使用生成器实现可迭代对象
2018/03/20 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
对python中字典keys,values,items的使用详解
2019/02/03 Python
Python字符串的一些操作方法总结
2019/06/10 Python
python爬取盘搜的有效链接实现代码
2019/07/20 Python
python正则表达式匹配IP代码实例
2019/12/28 Python
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
写给妈妈的道歉信
2014/01/11 职场文书
董事长助理工作职责
2014/06/08 职场文书
毕业生求职信范文
2014/06/29 职场文书
党员四风问题对照检查材料
2014/09/27 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
转变工作作风心得体会
2016/01/23 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android