Python气象数据处理与绘图(2):常用数据计算方法

Python016

Python气象数据处理与绘图(2):常用数据计算方法,第1张

对于气象绘图来讲,第一步是对数据的处理,通过各类公式,或者统计方法将原始数据处理为目标数据。

按照气象统计课程的内容,我给出了一些常用到的统计方法的对应函数

在计算气候态,区域平均时均要使用到求均值函数,对应NCL中的dim_average函数,在python中通常使用np.mean()函数

numpy.mean(a, axis, dtype)

假设a为[time,lat,lon]的数据,那么

需要特别注意的是,气象数据中常有缺测,在NCL中,使用求均值函数会自动略过,而在python中,当任意一数与缺测(np.nan)计算的结果均为np.nan,比如求[1,2,3,4,np.nan]的平均值,结果为np.nan

因此,当数据存在缺测数据时,通常使用np.nanmean()函数,用法同上,此时[1,2,3,4,np.nan]的平均值为(1+2+3+4)/4 = 2.5

同样的,求某数组最大最小值时也有np.nanmax(), np.nanmin()函数来补充np.max(), np.min()的不足。

其他很多np的计算函数也可以通过在前边加‘nan’来使用。

另外,

也可以直接将a中缺失值全部填充为0。

np.std(a, axis, dtype)

用法同np.mean()

在NCL中有直接求数据标准化的函数dim_standardize()

其实也就是一行的事,根据需要指定维度即可。

皮尔逊相关系数

相关可以说是气象科研中最常用的方法之一了,numpy函数中的np.corrcoef(x, y)就可以实现相关计算。但是在这里我推荐scipy.stats中的函数来计算相关系数:

这个函数缺点和有点都很明显,优点是可以直接返回相关系数R及其P值,这避免了我们进一步计算置信度。而缺点则是该函数只支持两个一维数组的计算,也就是说当我们需要计算一个场和一个序列的相关时,我们需要循环来实现。

其中a[time,lat,lon],b[time]

(NCL中为regcoef()函数)

同样推荐Scipy库中的stats.linregress(x,y)函数:

slop: 回归斜率

intercept:回归截距

r_value: 相关系数

p_value: P值

std_err: 估计标准误差

直接可以输出P值,同样省去了做置信度检验的过程,遗憾的是仍需同相关系数一样循环计算。

#导入包

import numpy as np

import pandas as pd

from matplotlib import pyplot as plt

from matplotlib.ticker import FuncFormatter

import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']  #设置简黑字体

mpl.rcParams['axes.unicode_minus'] = False  #设置负号正常显示

#----获取数据DataFrames,index*columns。index表示不同值范围,columns表示十六个风向

data = pd.DataFrame(wind_d_max_num_per,

                    index=['<15', '15~25', '25~35', '35~45',"≥45"],

                    columns='N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW'.split())

N = 16 # 风速分布为16个方向

theta = np.linspace(0, 2*np.pi, N, endpoint=False) # 获取16个方向的角度值

width = np.pi / 4 * 0.4  # 绘制扇型的宽度,可以自行调整0.5时是360,充满,有间隔的话小于0.5即可

labels = list(data.columns) # 自定义坐标标签为 N , NSN, ……# 开始绘图

plt.figure(figsize=(6,6),dpi=600)

ax = plt.subplot(111, projection='polar')

#----自定义颜色

mycolor =['cornflowerblue','orange','mediumseagreen','lightcoral','cyan']

#----循环画风玫瑰图

i=0

for idx in data.index:

    print(idx)

    # 每一行绘制一个扇形

    radii = data.loc[idx] # 每一行数据

    if i == 0:

        ax.bar(theta, radii, width=width, bottom=0.0, label=idx, tick_label=labels,

          color=mycolor[i])

    else:

        ax.bar(theta, radii, width=width, bottom=np.sum(data.loc[data.index[0:i]]), label=idx, tick_label=labels,

          color=mycolor[i])

    i=i+1

#此种画法,注意bottom设置,第一个bottom为0,后续bottom需要在前一个基础上增加。

ax.set_xticks(theta)

ax.set_xticklabels(labels,fontdict={'weight':'bold','size':15,'color':'k'})

ax.set_theta_zero_location('N') #设置零度方向北

ax.set_theta_direction(-1)    # 逆时针方向绘图

#----设置y坐标轴以百分数显示

plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda s, position: '{:.0f}%'.format(100*s)))

plt.legend(loc=4, bbox_to_anchor=(0.05, -0.25),fontsize=12) # 将label显示出来, 并调整位置

#----保存图片

plt.savefig("./windrose1.svg")

其实在(2)中已经提到了相关系数和回归系数,在计算过程中,直接返回了对应的p-value,因此可以直接使用p-value。

计算两个独立样本得分均值的T检验。

这是对两个独立样本具有相同平均值(预期值)的零假设的双边检验。此测试假设默认情况下总体具有相同的方差。在合成分析中通常用到t-test。

当a,b为变量场时,即[time,lat,lon]时,a,b两个数组的经纬度需相同。

nan_policy 可选{‘propagate’, ‘raise’, ‘omit’}

“propagate”:返回nan

“raise”:报错

“omit”:执行忽略nan值的计算

计算得到的P值用于绘图,当p<0.01时,通过99%显著性检验,p<0.05,通过95%显著性检验,以此类推。

图形绘制只需在原有填色图上叠加打点图层,实际上打点也是特殊的图色,只不过将颜色换成了点,实际上用到的还是contourf函数。

通过contourf对应参数调节打点图层的细节。