
泰勒图绘制的核心思想是设计一个只有第一象限的极坐标,并将方差,相关系数进行捆绑,通过转化为极坐标系坐标进行绘制。为了实现泰勒图的绘制,我设计了两个函数:
set_tayloraxes(fig, location=111) 和plot_taylor(axes, refsample, sample, args, kwargs)
set_tayloraxes()函数用于建立一个泰勒图的坐标系,这个自定义函数一般情况下不建议修改,每一个参数都是经过多次调试得到的,很可能牵一发动全身。因此,将绘图部分的独立成为了plot_taylor函数(),这部分函数较为简单,目的就是将需要绘图的数据,转换为极坐标系坐标,通过plot函数将散点打在泰勒图上,这个函数模块较为简单,可以根据自己的输入数据情况进行调整。
下面介绍下函数的具体用法:
输入:
fig: 需要绘图的figure
rect:图的位置,如111为1行1列第一个,122为1行2列第2个
输出:
polar_ax:泰勒坐标系
输入:
axes : setup_axes返回的泰勒坐标系
refsample :参照样本
sample :评估样本
args, kwargs :pltplot()函数的相关参数,设置点的颜色,形状等等。
下面给出示例:
前几文主要讲的是如何处理Xarray中的DataArray和DataSet,现在分享一下如何从nc文件或其他文件中读取数据,以及如何将处理好的数据输出成一个nc文件。
首先还是要再强调DataArray和DataSet的区别,DataArray是一个带标签结构的数组,DataSet是一个数据集,这意味着,从一个nc文件中读取到的全部信息构成了一个DataSet,而nc文件中的某一个变量是一个DataArray。
反之,我们要将一个数据写成nc文件,那么就是要创建一个DataSet。
这个数据结构有点像站点数据,对xy维设定了两层,分别是经纬度,还有一维时间维(whatever,反正是随便创建一个DataSet)。
就可以输出成nc文件了。
当然还可以更懒一点,
直接将abc这个DataArray转成DataSet,DataArray的标签和纬度信息会自动转换。
之后使用to_netcdf即可。
读取的语句也十分简单。
函数只需要基本的路径及文件名,无需像NCL一样声明状态'r'。
Xarray读取多文件也提供了相应函数(我目前没有使用过,我通常都是使用CDO提前处理,大家可以自行尝试)。
根据官方的介绍,Xarray也支持grib文件的读取。
前提是需要一个解码库"eccodes"
或者利用Xarray借助PYNIO去读。
官方文档中还有一部分是关于画图的,然而画图部分个人认为使用matplotlib+cartopy的组合更加灵活,因此Xarray系列到这里应该就完结了。
下一步的计划是按照魏凤英老师的统计方法一书,试着将常用的气象统计方法利用python去实现,但是水平实在有限。
# 风速 74-95 96-110 111-130 131-154 155及以上
# 级别 1 2 3 4 5
# 请编写程序,根据用户输入的风速,输出对应的飓风等级。
# 从测试集得到风速
velocity = int(input())
# 默认是0级
rank = 0
# 如果风速在74到95之间,输出1
if velocity >= 74 and not velocity > 95:
rank += 1
# 如果风速在96到110之间,输出2
elif velocity >= 96 and not velocity > 110:
rank += 2
# 如果风速在111到130之间,输出3
elif velocity >= 111 and not velocity > 130:
rank += 3
# 如果风速在131到154之间,输出4
elif velocity >= 131 and not velocity > 154:
rank += 4
# 如果风速大于155,输出5
elif velocity >= 155:
rank += 5
print(rank)
抓取温度云图数据需要先找到数据源,通常可以通过以下几种方式来获取:
使用API:有些网站提供API接口,可以通过编写Python代码来获取数据。例如,National Oceanic and Atmospheric Administration (NOAA)提供了RESTful API,可以用来获取气象数据,包括温度云图数据。
网络爬虫:通过编写Python爬虫程序,可以从网站上抓取温度云图数据。这种方式需要注意遵守网站的使用协议,不要违反网站规定。
以下是使用API的方法:
首先,需要注册NOAA的API账号,获取API密钥。
编写Python代码,使用requests库向API发送请求,并解析响应数据。以下是一个简单的示例代码:
import requests
import json
# 设置API请求参数
params = {
'product': 'sst',
'sensor': 'ghrsst',
'date': '2022-03-01',
'bbox': '-180,-90,180,90',
'format': 'json',
'access_token': 'your_access_token'
}
# 发送API请求
response = requestsget('>
# 解析响应数据
data = jsonloads(responsetext)
# 获取温度云图数据
temp_cloud_data = data['temperature_cloud']
注意:以上示例代码中,需要将your_access_token替换为你自己的API密钥。
3对获取到的温度云图数据进行处理和分析,然后将其可视化。
以上是一个简单的方法来获取温度云图数据,具体的实现方式可能因数据源不同而有所不同。在实际应用中,还需要考虑数据的格式、精度、更新频率等因素,以确保数据的准确性和可靠性。
这部分同pandas的gorupby函数基本相同,实现对数据的分组归类等等。
split·将数据分为多个独立的组。
apply·对各个组进行 *** 作。
combine·将各个组合并为一个数据对象。
创建一个dataset
我对官网的例子加以修改以便更好的理解。
解释下数据结构,创建了一个二维数据u(lat, lon),坐标数据为latitude 和country ,强调一下这里创建的是dataset,而不是dataArray,分不清的可以再看看本系列的第一篇文章。坐标数据不等于u的坐标。创建coords部分都指明了latitude 和 country 都是针对lat的扩展。
我们可以这样理解,对于纬度的分类,我们可以按纬度的大小分,也就是"latitude": [10, 20, 30, 40] ; 我们也可以对纬度所在的国家分,"country": ("x", list("abba") ,那比如我们想求某个国家的数据的平均时就十分方便。
下边我们进行分组:
说明第0和第4个数是国家a的,第2和第3是国家b的。
groups换成mean() 则就是对分组求平均,以此类推。
必须添加一个list才可以将其分类结果打印出来。直接打印DatasetGroupBy object是不能输出结果的。
那么针对经纬度的坐标的分组怎么实现呢,比如说选出区间在多少到多少之间的?
groupby_bins() 函数可以解决这一问题。
还是这个数据,"latitude": [10, 20, 30, 40]
那我们想以25为界,分为两组,0-25,25-50
在进行了分组后,要对各个分组进行计算。
我们先从dataset 中取出 u 这个dataarray
比如是实现前边提到的按国家进行数据平均,或者标准化
也可以通过map()函数使用一些自定义的函数,比如说标准化,
这个用法是官方提供的,但是我的Xarray版本过低,还不支持这种用法(Xarray会定期更新,以至于可能我介绍过的一些方法有了更简便的 *** 作,大家可以在评论区留言)。
强调一句,Xarray官方的更新是比较快的,很可能我写在这里的函数官方又给出了更新的版本,但是我没办法做到时刻与官方最新同步,所以如果遇到问题,最好的解决办法还是去查阅官方文档的对应部分。
这一部分涉及到了常用的 *** 作,比如调换维度的位置,给数据重新reshape换形等等,建议大家可以认真阅读这部分。
老样子,先新建一个数组
比如说在求某个东西时需要将时间维放在最后一维,但是数据本身的时间在第一维,那么便可以用到这个 *** 作。
第一种是精准换位,指定每个维度的位置
第二种是单独换位,只对指定维度换位,将time放在最后,其余不变
第三种为全部换位,相当于数组转置
扩展指增加一个维度,压缩指将一个维度挤压掉
官方文档中接下来有一段是关于DataArray向DataSet转换的,个人感觉放在这一章节并不合理,我后边会整理放进Python气象数据处理进阶之Xarray(1)中(我觉得两种基础数据结构以及互相转换应该最开始介绍的)。所以接下来跳过这部分。
个人感觉可能处理站点数据会用到这个方法
换一个数组演示
现在将这个2维数组堆叠成1维
也可以拆分,其实就是反堆叠
最重要的是不同于Pandas,Xarray的stack不缺自动丢失缺测值!!!
Xarray还提供了将不同变量stack的例子,有兴趣的可以去看看。这个用法感觉比较鸡肋
这块比较难理解,建议还是先读第一篇文章,弄清数据结构,da数组显示Dimensions without coordinates: x,而通过daset_index函数,将X设置为混合索引号。
之后便可以实线自由索引:
通过mdareset_index('x')重置。
reorder_levels()函数允许调换索引顺序(个人感觉比较鸡肋)
这小节应该是这篇文章和数组换形换维同等重要的。
这就是对数组进行滚动。这个的作用主要在于做差分计算。虽然前边讲过Xarray提供了中央差计算函数,但是仍需要更灵活的 *** 作,滚动函数就实现了这个目的。
对于气象绘图来讲,第一步是对数据的处理,通过各类公式,或者统计方法将原始数据处理为目标数据。
按照气象统计课程的内容,我给出了一些常用到的统计方法的对应函数:
在计算气候态,区域平均时均要使用到求均值函数,对应NCL中的dim_average函数,在python中通常使用npmean()函数
numpymean(a, axis, dtype)
假设a为[time,lat,lon]的数据,那么
需要特别注意的是,气象数据中常有缺测,在NCL中,使用求均值函数会自动略过,而在python中,当任意一数与缺测(npnan)计算的结果均为npnan,比如求[1,2,3,4,npnan]的平均值,结果为npnan
因此,当数据存在缺测数据时,通常使用npnanmean()函数,用法同上,此时[1,2,3,4,npnan]的平均值为(1+2+3+4)/4 = 25
同样的,求某数组最大最小值时也有npnanmax(), npnanmin()函数来补充npmax(), npmin()的不足。
其他很多np的计算函数也可以通过在前边加‘nan’来使用。
另外,
也可以直接将a中缺失值全部填充为0。
npstd(a, axis, dtype)
用法同npmean()
在NCL中有直接求数据标准化的函数dim_standardize()
其实也就是一行的事,根据需要指定维度即可。
皮尔逊相关系数:
相关可以说是气象科研中最常用的方法之一了,numpy函数中的npcorrcoef(x, y)就可以实现相关计算。但是在这里我推荐scipystats中的函数来计算相关系数:
这个函数缺点和有点都很明显,优点是可以直接返回相关系数R及其P值,这避免了我们进一步计算置信度。而缺点则是该函数只支持两个一维数组的计算,也就是说当我们需要计算一个场和一个序列的相关时,我们需要循环来实现。
其中a[time,lat,lon],b[time]
(NCL中为regcoef()函数)
同样推荐Scipy库中的statslinregress(x,y)函数:
slop: 回归斜率
intercept:回归截距
r_value: 相关系数
p_value: P值
std_err: 估计标准误差
直接可以输出P值,同样省去了做置信度检验的过程,遗憾的是仍需同相关系数一样循环计算。
以上就是关于Python气象数据处理与绘图(18):泰勒图全部的内容,包括:Python气象数据处理与绘图(18):泰勒图、Python气象数据处理进阶之Xarray(7):读写文件、Python问题 原题为educoder控制程序一 根据用户输入的风速,输出对应的飓风等级等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)