【NCL】ENSO冷暖事件海温异常合成与t检验

本代码参考了施宁老师《NCL数据处理与绘图实习教程》一书,按实际情况有所增删。主要效果为合成ENSO年厄尔尼诺和拉尼娜海温异常,并进行t检验,将置信度为0.05的区域打点。(由于没有专门的NCL高亮代码块,特别注意分号后面全部为注释部分)。

另外,代码书写过程中断断续续,导致每个步骤独立性很强。重复进行的步骤可以缩减,例如在绘图部分可以直接res2=True/res2=res1,而后更改图名即可。错处欢迎指正~~

year=ispan(1940,2018,1)
it_s=194012;;海温数据
it_e=201811
;;;;;;;;;;;;;;;;;;;;;;;;;;;read data;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;HadIsst——1870-2019
f_sst=addfile("/data/home//Data/SST/sst.mon.mean.nc","r")
time =f_sst->time;;读取日期数据
YYYYMM=cd_calendar(time,-1);;转换为公历日期
rec_s=ind(it_s.eq.YYYYMM);;开始日期的记录号
rec_e=ind(it_e.eq.YYYYMM);;终止日期的记录号
sst=f_sst->sst

sst_34=sst(rec_s:rec_e,:,:);;截取开始——终止的时段资料
sst_DJF=month_to_season(sst_34, "JFM");求JFM的季节平均
; printVarSummary(sst_34)
copy_VarMeta(sst_34(0,:,:),sst_DJF(0,:,:));copy_VarMeta(var_from, var_to)将前者的属性给后者
sst_DJF!0="year";;;第一维的变量名字是year
sst_DJF&year=year;;
;printVarSummary(sst_DJF)
sst_ano=dim_rmvmean_n_Wrap(sst_DJF,0)
copy_VarCoords(sst_DJF, sst_ano)
ensoi=wgt_areaave(sst_DJF(:,{-5:5},{190:240}),1.0,1.0,0)
;;0表示仅用非缺省数值计算
;;标准化函数
ensoi=dim_standardize(ensoi, 1)
; ;;1表示标准化时除以[N],1表示除以[N-1]
;printVarSummary(ensoi)
;;;;;;;;;;;;;;;;;;;;;;composite;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
irec_positive=ind(ensoi.gt.0.8)
irec_negative=ind(ensoi.lt.-0.8)
;irec_negative=ind(ensoi.gt.-0.8);;
nnumb=dimsizes(irec_positive)
nnuma=dimsizes(irec_negative)
nino_comp=dim_avg_n_Wrap(sst_ano(irec_positive,:,:),0)
nina_comp=dim_avg_n_Wrap(sst_ano(irec_negative,:,:),0)
copy_VarCoords(sst_ano(0,:,:), nino_comp)
copy_VarCoords(sst_ano(0,:,:), nina_comp)
;printVarSummary(sst_comp)
;;;;;;;;;;;;;;;;;;;(t-test);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;sst
nino_std=dim_variance_n_Wrap(sst_ano(irec_positive,:,:), 0)
nina_std=dim_variance_n_Wrap(sst_ano(irec_negative,:,:), 0)
nino_std=sqrt(nino_std/nnumb);;标准差
nino_std=where(nino_std.eq.0,nino_std@_FillValue,nino_std);
nina_std=sqrt(nina_std/nnuma);;标准差
nina_std=where(nina_std.eq.0,nina_std@_FillValue,nina_std)

t_nino=nino_comp/nino_std;;;
confi_nino=nino_comp
confi_nino=student_t(t_nino, nnumb-1)
t_nina=nina_comp/nina_std
confi_nina=nina_comp
confi_nina=student_t(t_nina, nnuma-1)
;print(sst_comp)
copy_VarCoords(nino_comp, confi_nino)
copy_VarCoords(nina_comp, confi_nina)
;printVarSummary(confi_sst)
;;;第一种方法分EP和CP
enso3i=wgt_areaave(sst_DJF(:,{-5:5},{210:270}),1.0,1.0,0)
enso3i_s=dim_standardize(enso3i, 1)
enso4i=wgt_areaave(sst_DJF(:,{-5:5},{160:210}),1.0,1.0,0)
enso4i_s=dim_standardize(enso4i, 1)
irec_EP=ind((enso3i_s.gt.1).and.(enso3i.gt.enso4i))
irec_CP=ind((enso4i_s.gt.1).and.(enso4i.gt.enso3i))
nnume=dimsizes(irec_EP)
nnumc=dimsizes(irec_CP)
EP_comp=dim_avg_n_Wrap(sst_ano(irec_EP,:,:),0)
CP_comp=dim_avg_n_Wrap(sst_ano(irec_CP,:,:),0)
copy_VarCoords(sst_ano(0,:,:), EP_comp)
copy_VarCoords(sst_ano(0,:,:), CP_comp)

EP_std=dim_variance_n_Wrap(sst_ano(irec_EP,:,:), 0)
CP_std=dim_variance_n_Wrap(sst_ano(irec_CP,:,:), 0)
EP_std=sqrt(EP_std/nnume);;标准差
EP_std=where(EP_std.eq.0,EP_std@_FillValue,EP_std);;;
CP_std=sqrt(CP_std/nnumc);;标准差
CP_std=where(CP_std.eq.0,CP_std@_FillValue,CP_std)

t_EP=EP_comp/EP_std;;;
confi_EP=EP_comp
confi_EP=student_t(t_EP, nnume-1)
t_CP=CP_comp/CP_std
confi_CP=CP_comp
confi_CP=student_t(t_CP, nnumc-1)
copy_VarCoords(EP_comp, confi_EP)
copy_VarCoords(CP_comp, confi_CP)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
wks=gsn_open_wks("PDF", "/data/home/yuancx/wangjy/nino_compo_test/try6")
gsn_define_colormap(wks, "MPL_coolwarm")
plot=new(4,"graphic")
base=new(4,"graphic")

res                            =True
res@gsnAddCyclic               =True
res@gsnDraw                    =False
res@gsnFrame                   =False
res@gsnLeftString              =""
res@gsnRightString             =""
res@mpCenterLonF               =180;中心经度为180°
res@mpGeophysicalLineThicknessF=0.2;地图边界
res@mpFillOn                   =False;地图不填色
res@mpGridAndLimbOn            =True;绘制经纬度线
res@mpGridLatSpacingF          =15;纬度线的间隔
res@mpGridLonSpacingF          =15;经度线的间隔
res@mpGridLineDashPattern      =2
res@mpGridLineThicknessF       =0.05;经纬线的粗细
res@cnFillOn                   =True;填充图
res@lbLabelBarOn               =True;色标打开
res@lbOrientation              ="Horizontal"
res@cnLinesOn                  =False;不要等值线怪丑的
res@cnLineLabelsOn             =False;等值线上不要标签
res@cnLevelSelectionMode       ="ExplicitLevels"
res@cnLevels                   =(/-1.4,-1.2,-1.0,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1.0,1.2,1.4/)
res@cnLineThicknessF           =2
res@cnInfoLabelOn              =False
res@gsnCenterString            ="El-nino"
res@gsnCenterStringFontHeightF =0.02
plot(0)=gsn_csm_contour_map(wks, nino_comp, res)

res3                            =True
res3@gsnAddCyclic               =True
res3@gsnDraw                    =False
res3@gsnFrame                    =False
res3@gsnLeftString              =""
res3@gsnRightString             =""
res3@mpCenterLonF               =180;中心经度为180°,全球图要从20度经度开始,后面注意!
res3@mpGeophysicalLineThicknessF=0.2;地图边界
res3@mpFillOn                   =False;地图不填色
res3@mpGridAndLimbOn            =True;绘制经纬度线
res3@mpGridLatSpacingF          =15;纬度线的间隔
res3@mpGridLonSpacingF          =15;经度线的间隔
res3@mpGridLineDashPattern      =2
res3@mpGridLineThicknessF       =0.05
res3@cnFillOn                   =True;填充图
res3@lbLabelBarOn               =True;色标打开
res3@lbOrientation              ="Horizontal"
res3@cnLinesOn                  =False;不要等值线怪丑的
res3@cnLineLabelsOn             =False;等值线上不要标签
res3@cnLevelSelectionMode       ="ExplicitLevels"
res3@cnLevels                   =(/-1.4,-1.2,-1.0,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1.0,1.2,1.4/)
res3@cnLineThicknessF           =2
res3@cnInfoLabelOn              =False
res3@gsnCenterString            ="La-nina"
res3@gsnCenterStringFontColor   =0.02
plot(1)=gsn_csm_contour_map(wks, nina_comp, res3)

res1                            =True
res1@gsnAddCyclic               =True
res1@gsnDraw                    =False
res1@gsnFrame                   =False
res1@gsnLeftString              =""
res1@gsnRightString             =""
res1@mpCenterLonF               =180;中心经度为180°
res1@mpGeophysicalLineThicknessF=0.2;地图边界
res1@mpFillOn                   =False;地图不填色
res1@mpGridAndLimbOn            =True;绘制经纬度线
res1@mpGridLatSpacingF          =15;纬度线的间隔
res1@mpGridLonSpacingF          =15;经度线的间隔
res1@mpGridLineDashPattern      =2
res1@mpGridLineThicknessF       =0.05;经纬线的粗细
res1@cnFillOn                   =True;填充图
res1@lbLabelBarOn               =True;色标打开
res1@lbOrientation              ="Horizontal"
res1@cnLinesOn                  =False;不要等值线怪丑的
res1@cnLineLabelsOn             =False;等值线上不要标签、
res1@cnLevelSelectionMode       ="ExplicitLevels"
res1@cnLevels                   =(/-1.4,-1.2,-1.0,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1.0,1.2,1.4/)
res1@cnLineThicknessF           =2
res1@cnInfoLabelOn              =False
res1@gsnCenterString            ="EP(nino3>1std&nino3>nino4)"
res1@gsnCenterStringFontHeightF =0.02
plot(2)=gsn_csm_contour_map(wks, EP_comp, res1)

res2                            =True
res2@gsnAddCyclic               =True
res2@gsnDraw                    =False
res2@gsnFrame                   =False
res2@gsnLeftString              =""
res2@gsnRightString             =""
res2@mpCenterLonF               =180;中心经度为180°
res2@mpGeophysicalLineThicknessF=0.2;地图边界
res2@mpFillOn                   =False;地图不填色
res2@mpGridAndLimbOn            =True;绘制经纬度线
res2@mpGridLatSpacingF          =15;纬度线的间隔
res2@mpGridLonSpacingF          =15;经度线的间隔
res2@mpGridLineDashPattern      =2
res2@mpGridLineThicknessF       =0.05;经纬线的粗细
res2@cnFillOn                   =True;填充图
res2@lbLabelBarOn               =True;色标打开
res2@lbOrientation              ="Horizontal"
res2@cnLinesOn                  =False;不要等值线怪丑的
res2@cnLineLabelsOn             =False;等值线上不要标签、
res2@cnLevelSelectionMode       ="ExplicitLevels"
res2@cnLevels                   =(/-1.4,-1.2,-1.0,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1.0,1.2,1.4/)
res2@cnLineThicknessF           =2
res2@cnInfoLabelOn              =False
res2@gsnCenterString            ="CP(nino4>1std&nino4>nino3)"
res2@gsnCenterStringFontHeightF =0.02
plot(3)=gsn_csm_contour_map(wks, CP_comp, res2)

;;;打点部分施工中——请出示健康码;;;;;;;
opt                      =True
opt@gsnShadeFillType     ="pattern"
opt@gsnShadeLow          =17;打点
opt@gsnAddCyclic         =True
opt@cnFillDotSizeF       =0.001;改变点大小的默认值

sres                     =True
sres@gsnDraw             =False
sres@gsnFrame            =False
sres@cnLinesOn           =False
sres@gsnLeftString       =""
sres@gsnRightString      =""
sres@cnLevelSelectionMode="ExplicitLevels"
sres@cnLevels            =(/0.05,0.01/)
sres@cnFillPalette       ="GMT_gray"
sres@cnFillColors        =(/5,7,-1/)
sres@cnLineLabelsOn      =False
sres@cnInfoLabelOn       =False
sres@lbLabelBarOn        =False
base(0)=gsn_csm_contour(wks,confi_nino, sres)
base(0)=gsn_contour_shade(base(0),0.05,1,opt)
overlay(plot(0),base(0))
base(1)=gsn_csm_contour(wks,confi_nina, sres)
base(1)=gsn_contour_shade(base(1),0.05,1,opt)
overlay(plot(1),base(1))
base(2)=gsn_csm_contour(wks,confi_EP, sres)
base(2)=gsn_contour_shade(base(2),0.05,1,opt)
overlay(plot(2),base(2))
base(3)=gsn_csm_contour(wks,confi_CP, sres)
base(3)=gsn_contour_shade(base(3),0.05,1,opt)
overlay(plot(3),base(3))


resP                                 =True
resP@txstring                        ="ENSO composite"
resP@txFontHeightF                   =0.03
resP@gsnPanelFigureStrings           =(/"(a)","(b)","(c)","(d)","(e)","(f)","(g)","(h)"/)
resP@gsnPanelFigureStringsFontHeightF=0.008
resP@amJust                          ="TopLeft"
resP@gsnPanelRowSpec                 =True
gsn_panel(wks,plot,(/2,2,2,2/),resP)

如图所示,合成效果不算完美,尚在改进
合成效果如上图所示,结果尚不完美,有待改进(~ ̄▽ ̄)~

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值