爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 43228|回复: 47

[作图] ncl计算svd脚本

  [复制链接]

新浪微博达人勋

发表于 2018-1-29 09:46:15 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
最近用ncl算了印度洋区域的夏季SST和OLR的svd函数,在论坛上没有找到现成的脚本,折腾好久才弄好,现在把我折腾的结果放上来,供同我一样的小白交流学习。
先用svdcov函数计算出图2中的时间序列,然后分别算了sst和OLR跟对方时间序列的相关系数(图1),通过检验的打点。
如果有错误欢迎指正~
olr&sst_kongjian.000001.png 79_16_olr&sst_shijian.png

olr_sst.ncl

11.58 KB, 下载次数: 196, 下载积分: 金钱 -5

售价: 1 贡献  [记录]

评分

参与人数 1金钱 +5 收起 理由
zimolinghan + 5

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-1-29 09:48:41 | 显示全部楼层
为啥我没设置要贡献还是需要。。。
脚本如下:

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/shea_util.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/contrib/run_cor.ncl"
   
    latS_U   =  -20
    latN_U   =   20
    lonL_U   =   40
    lonR_U   =  120
   
    ; latS_P   =  -20
    ; latN_P   =  20
    ; lonL_P   =  40
    ; lonR_P   =  120

    yrStrt = 1974
    yrLast = 2016
    season  = "JJA"
    years = ispan(yrStrt,yrLast,1)
    nyears  = dimsizes(years)
    print(nyears)

;================================================
;Variables List:
;   var1--------------sst
;   var2--------------olr
;================================================

;initial data
sst_in = addfile("/Users/zhangguangli/Desktop/work/data/sst/HadISST_sst.nc", "r")
time_sst = sst_in->time
XXXX = cd_calendar(time_sst,-1 )
t_index_start1 = ind(XXXX.eq.197401)
t_index_end1   = ind(XXXX.eq.201612)
sst = sst_in->sst(t_index_start1:t_index_end1,:,:)
sst_sm = month_to_season(sst, "JJA")

sst_summer = dim_standardize_n(sst_sm, 0, 0)
copy_VarCoords(sst_sm, sst_summer)
printVarSummary(sst)
delete(sst)
sst = dim_standardize_n(sst_summer, 0, 0)
copy_VarCoords(sst_summer, sst)

olr_in = addfile("/Users/zhangguangli/Desktop/work/data/olr.mon.mean_197406_201701.nc", "r")
olr1 = olr_in->olr
olr  = short2flt(olr1)
printVarSummary(olr)

olr_0 = dim_avg_n_Wrap(olr(0:2,:,:), 0)
printVarSummary(olr_0)

time_olr = olr_in->time
XXXX1 = cd_calendar(time_olr,-1 )
  t_index_start11 = ind(XXXX1.eq.197501)
  t_index_end11   = ind(XXXX1.eq.201612)
olr_2 = olr_in->olr(t_index_start11:t_index_end11,:,:)
olr_22= short2flt(olr_2)
printVarSummary(olr_22)
olr_2_sm = month_to_season(olr_22, "JJA")
printVarSummary(olr_2_sm)

olr_sm = new((/43,73,144/),float)
olr_sm(0,:,:) = olr_0(:,:)
olr_sm(1:3,:,:) = olr_2_sm(0:2,:,:)
olr_sm(4,:,:) = dim_avg_n_Wrap(olr_2_sm, 0)
olr_sm(5:42,:,:) = olr_2_sm(4:41,:,:)
copy_VarCoords(olr_0,olr_sm(0,:,:))
olr_sm!0 = "time"
printVarSummary(olr_sm)

delete(olr)
olr = dim_standardize_n(olr_sm, 0, 0)
copy_VarCoords(olr_sm, olr)

printVarSummary(sst)
printVarSummary(olr)

    nmca = 2 ; how many MCA we need
    var1_region = sst(:,{latS_U:latN_U},{lonL_U:lonR_U});把sst数据reshape成二维
    var1_size = dimsizes(var1_region)
    n_var1_size = var1_size(1)*var1_size(2)
    homlft = new((/nmca,n_var1_size/),float)
    hetlft = new((/nmca,n_var1_size/),float)
    var1_ano_line = reshape(var1_region,(/var1_size(0),n_var1_size/))
    var1_ano_line!0 = "time"
    var1_ano_line!1 = "pts"
    printVarSummary(var1_ano_line)
    printMinMax(var1_ano_line, False)

    var2_region = olr(:,{latS_U:latN_U},{lonL_U:lonR_U});把olr数据reshape成二维
    var2_size = dimsizes(var2_region)
    n_var2_size = var2_size(1)*var2_size(2)
    homrgt = new((/nmca,n_var2_size/),float)
    hetrgt = new((/nmca,n_var2_size/),float)
    var2_ano_line = reshape(var2_region,(/var2_size(0),n_var2_size/))
    var2_ano_line!0 = "time"
    var2_ano_line!1 = "pts"
    printVarSummary(var2_ano_line)
    printMinMax(var2_ano_line, False)

  ntime   = nyears                             ; # time steps
  ncols   = n_var1_size                        ; # columns (stations or grid pts) for S
  ncolz   = var2_size                          ; # columns (stations or grid pts) for Z
  nsvd    = 2                                  ; # svd patterns to calculate
                                               ;   [nsvd <= min(ncols, ncolz) ]
  ; xmsg    = -999.9                             ; missing value
  x = svdcov(var1_ano_line(pts|:,time|:),var2_ano_line(pts|:,time|:),nsvd,homlft,hetlft,homrgt,hetrgt)
  print("svdcov: percent variance= " + x)
  printVarSummary(x)

ak   = onedtond(x@ak,(/nsvd,ntime/))
  bk   = onedtond(x@bk,(/nsvd,ntime/))
  ak!0 = "sv"
  ak!1 = "time"
  bk!0 = "sv"
  bk!1 = "time"

  ccr = escorc(ak(0,:), bk(0,:))
  print(ccr)

  print(ak)
  print(bk)

    ak_std = dim_standardize_Wrap(ak,1)
    bk_std = dim_standardize_Wrap(bk,1)
    printVarSummary(ak_std)
    printVarSummary(bk_std)

    data = new((/2,nyears/),"float")
    data(0,:) = ak_std(0,:)
    data(1,:) = bk_std(0,:)

  ccr_ak = escorc_n(ak(0,:), olr, 0, 0)*-1
  copy_VarCoords(olr(0,:,:), ccr_ak)
  printVarSummary(ccr_ak)

  ccr_bk = escorc_n(bk(0,:), sst, 0, 0)*-1
  copy_VarCoords(sst(0,:,:), ccr_bk)
  printVarSummary(ccr_bk)


  test_ak = rtest(ccr_ak, nyears, 0)
  ; test_ak = where(ccr_ak.eq.ccr_ak@_FillValue, test_ak@_FillValue, test_ak)
  copy_VarCoords(ccr_ak, test_ak)

  ; test_bk = new((/180,360/),float)
  ; test_bk = sqrt(nyears-2)*ccr_bk/sqrt(1-ccr_bk*ccr_bk)
  ; test_bk=(/student_t(test_bk, nyears-2/)
  test_bk = rtest(ccr_bk, nyears, 0)
  test_bk = where(ccr_bk.eq.ccr_bk@_FillValue, test_bk@_FillValue, test_bk)
  copy_VarCoords(ccr_bk, test_bk)
  test_bk_reverse = 1 - test_bk
  copy_VarCoords(test_bk, test_bk_reverse)

  printVarSummary(test_ak)
  printMinMax(test_ak, False)
  printVarSummary(test_bk)
  printMinMax(test_bk, False)

  ; ==============================================================
; Set the figure parameters
; ==============================================================

    wks  = gsn_open_wks("png","olr&sst_kongjian")
    plot = new(2,"graphic")     ;shading
    plot_prob = new(2,"graphic")     ;shading
    gsn_define_colormap(wks,"BlueWhiteOrangeRed")

    res                             = True
    ;res@cnFillDrawOrder             = "PreDraw"
    res@gsnDraw                     = False
    res@gsnFrame                    = False      ;don't advance frame
    res@gsnAddCyclic                = False      ;EOF data is not cyclic
    res@cnFillOn                    = True         ; turn on color fill
    res@cnLinesOn                   = False
    res@cnLineLabelsOn              = False      ;turn off cn line labels
    res@cnInfoLabelOn               = False      ;turn off contour information label
    res@mpFillOn                    = True        ; turn off map fill
    res@mpMinLatF                   = latS_U
    res@mpMaxLatF                   = latN_U
    res@mpMinLonF                   = lonL_U
    res@mpMaxLonF                   = lonR_U
    res@mpCenterLonF                = (lonL_U+lonR_U)/2
   
    res@lbLabelBarOn        = False
;   res@lbOrientation       = "Vertical"
    res@pmLabelBarHeightF   = 0.08
    res@pmLabelBarWidthF    = 0.55
    res@lbLabelFontHeightF  = 0.018
    res@pmLabelBarOrthogonalPosF    = 0.14

    res@tmXBLabelFontHeightF        = 0.022    ;font height of tick labels
    res@tmYLLabelFontHeightF        = 0.022
    res@tmXBTickSpacingF            = 10.     ;label spacing
    res@tmYLTickSpacingF            = 10.    ;label spacing

    res@gsnLeftStringFontHeightF    = 0.022
    res@gsnRightStringFontHeightF   = 0.022
    res@gsnLeftString               = "(a)SST"
    res@gsnRightString              = season
    res@cnLevelSelectionMode = "ManualLevels"
    res@cnMinLevelValF = -1
    res@cnMaxLevelValF = 1
    res@cnLevelSpacingF = 0.1
    plot(0) = gsn_csm_contour_map(wks,ccr_bk,res)

    res@tmYLTickSpacingF    = 10.
    res@tmXBTickSpacingF    = 10.     ;label spacing
    res@pmLabelBarOrthogonalPosF    = 0.25
    res@mpMinLatF           = latS_U
    res@mpMaxLatF           = latN_U
    res@mpMinLonF           = lonL_U
    res@mpMaxLonF           = lonR_U
    res@mpCenterLonF        = (lonL_U+lonR_U)/2
    res@gsnLeftString       = "(b)OLR"

    res@cnLevelSelectionMode = "ManualLevels"
    res@cnMinLevelValF = -1
    res@cnMaxLevelValF = 1
    res@cnLevelSpacingF = 0.1

    plot(1) = gsn_csm_contour_map(wks,ccr_ak,res) ; create a default plot
  
    res2 = True
    res2@gsnDraw = False
    res2@gsnFrame = False
    res2@gsnDraw                     = False
    res2@gsnFrame                    = False      ;don't advance frame
    res2@gsnAddCyclic                = False      ;EOF data is not cyclic
    res2@cnFillOn                    = True         ; turn on color fill
    res2@cnLinesOn                   = False
    res2@cnLineLabelsOn              = False      ;turn off cn line labels
    res2@cnInfoLabelOn               = False      ;turn off contour information label
    res2@cnFillOn = True
    res2@cnLinesOn = False
    res2@cnLineLabelsOn = False
    res2@cnInfoLabelOn = False
    res2@lbLabelBarOn = False
    res2@cnMonoFillPattern = False
    res2@cnLevelSelectionMode = "ExplicitLevels"
    res2@cnLevels = (/0.1/)                       ;; set to significance level
    res2@cnFillPatterns = (/17,-1/)
    res2@cnFillColors = (/1,0/)
    res2@cnFillDotSizeF = 0.003
  
    res2@gsnLeftString = ""
    res2@gsnAddCyclic  = True

  plot_prob(0) = gsn_csm_contour(wks, test_bk, res2)
   
    ; res2@cnLevelSelectionMode = "ExplicitLevels"
    ; res2@cnLevels = (/0.05/)                       ;; set to significance level
    ; res2@cnFillPatterns = (/-1,17/)
    ; res2@cnFillColors = (/1,0/)
  plot_prob(1) = gsn_csm_contour(wks, test_ak, res2)

do i = 0, 1
    overlay(plot(i), plot_prob(i))
end do
   
;************************************************
; panel plot only resources
;************************************************
resP = True
resP@gsnPanelLabelBar = True
; resP@lbOrientation = "Vertical"
resP@gsnPanelMainString = "JJA IO SST&OLR SVD"
gsn_panel(wks,plot,(/2,1/),resP)     ; now draw as one plot
;************************************************
    wks_ts  = gsn_open_wks("png","olr&sst_shijian")

    rts           = True
    rts@gsnDraw   = False       ; don't draw yet
    rts@gsnFrame  = False       ; don't advance frame yet
    rts@vpXF     = 0.15
    rts@vpWidthF = 0.8
    rts@vpHeightF= 0.35
    rts@tiYAxisString = "Standardized"         ; y-axis label
;   rts@tiYAxisString = " "                    ; y-axis label
    rts@tmXBLabelFontHeightF = 0.02    ;font height of tick labels
    rts@tmYLLabelFontHeightF = 0.02   
    rts@gsnLeftStringFontHeightF = 0.02
    rts@gsnRightStringFontHeightF = 0.02

    rts@gsnYRefLine        = 0.              ; reference line   
    rts@xyLineColors       = (/"blue","red"/) ; colors chosen
    rts@xyLineThicknesses  = (/3.0,3.0/)      ; line thicknesses
    rts@xyDashPatterns     = (/0.,0./)      ; make all lines solid

    rts@trXMinF          = yrStrt  ; leave a margin for legend
    rts@trXMaxF          = yrLast
    ;rts@tmXBMode         = "Manual" ; Define own tick mark labels.
    rts@tmXBTickSpacingF = 5

    rts@trYMinF      = -3.0            ; min value on x-axis
    rts@trYMaxF      = 3.0            ; max value on x-axis
   
    rts@gsnLeftString = "Time Series of SVD1 (R = "+sprintf("%5.2f",ccr)+")"
    rts@gsnRightString = sprintf("%5.2f",x(0))+"%"
    plot_ts = gsn_csm_xy(wks_ts,years,data*-1,rts)

;---------------------------Add plot legend-----------------------------------
    res_lines                   = True                  ; polyline mods desired
    res_lines@gsLineDashPattern = 0.                    ; solid line
    res_lines@gsLineThicknessF  = 3.                    ; line thicker
   
    res_text                    = True                  ; text mods desired
    res_text@txFontHeightF      = 0.015                 ; change text size
    res_text@txJust             = "CenterLeft"          ; text justification

    res_lines@gsLineColor       = "blue"
    yy = (/2.5,2.5/)
    xx = (/2007,2010/)
    text_pos = 2011
    dum11 = gsn_add_polyline(wks_ts,plot_ts,xx,yy,res_lines)              ; add polyline
    dum12 = gsn_add_text(wks_ts,plot_ts,"SST",text_pos,yy(0),res_text); add text

    res_lines@gsLineColor       = "red"
    yy = yy - 0.6
    dum21 = gsn_add_polyline(wks_ts,plot_ts,xx,yy,res_lines)              ; add polyline
    dum22 = gsn_add_text(wks_ts,plot_ts,"OLR",text_pos,yy(0),res_text); add text

    draw(plot_ts)

    frame(wks)
    frame(wks_ts)


密码修改失败请联系微信:mofangbao
回复 支持 4 反对 0

使用道具 举报

新浪微博达人勋

发表于 2018-8-12 16:21:11 | 显示全部楼层
hxyj 发表于 2018-8-10 22:14
海温都是有缺测值的,请教一下,该如何去除这些缺测值,是将其设为0吗?

不是,先把序列中的缺测值踢掉,计算SVD后,再还原为原来的维度信息。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2019-10-27 19:35:11 | 显示全部楼层
littleqi 发表于 2018-6-19 11:13
请问楼主为什么要对sst进行两次标准化呢?标准化的时候可以直接用dim_standardize_Wrap代替dim_standardize ...

svdcov, does not standardize the input arrays x and y.不需要进行标准化
密码修改失败请联系微信:mofangbao
回复 支持 0 反对 1

使用道具 举报

新浪微博达人勋

发表于 2019-3-17 11:15:47 | 显示全部楼层
你好 请问求左右异类相关的时候为什么乘-1呢?还有画时间序列的时候data*-1?
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2020-1-1 23:39:24 来自手机 | 显示全部楼层
我有点不懂,输出变量都是什么
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2018-6-19 11:04:34 | 显示全部楼层
C:\Users\Administrator\Desktop\QQ图片20180619110038.png
z场站点数是不是应该这样呀  ncolz   = n_var2_size
密码修改失败请联系微信:mofangbao
回复 支持 0 反对 1

使用道具 举报

新浪微博达人勋

发表于 2018-1-29 15:47:39 | 显示全部楼层
{:5_213:}{:5_213:}{:5_213:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-6-19 11:08:51 | 显示全部楼层
图片在这里。
QQ图片20180619110038.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-6-19 11:13:21 | 显示全部楼层
请问楼主为什么要对sst进行两次标准化呢?标准化的时候可以直接用dim_standardize_Wrap代替dim_standardize_n(sst_sm, 0, 0)和copy_VarCoords(sst_sm, sst_summer)吗?
QQ图片20180619110849.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-6-19 20:02:10 | 显示全部楼层
楼主计算左右异类相关的时候乘了-1,输出左右场时间系数的时候也乘了-1,这是为什么呀?问题比较多,希望楼主能解答,不胜感激!
QQ图片20180619195409.png
QQ图片20180619195235.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-19 21:37:25 | 显示全部楼层
svdcov(var1_ano_line(pts|:,time|:),var2_ano_line(pts|:,time|:),nsvd,homlft,hetlft,homrgt,hetrgt) ,请问算出来的hetlft,hetrgt是不是就是左异性相关系数和右异性相关系数
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-20 14:18:22 | 显示全部楼层
晨曦雨下cxyx 发表于 2018-7-19 21:37
svdcov(var1_ano_line(pts|:,time|:),var2_ano_line(pts|:,time|:),nsvd,homlft,hetlft,homrgt,hetrgt) , ...

对的,Hom...是同性相关系数
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-7-20 14:27:31 | 显示全部楼层
晨曦雨下cxyx 发表于 2018-7-19 21:37
svdcov(var1_ano_line(pts|:,time|:),var2_ano_line(pts|:,time|:),nsvd,homlft,hetlft,homrgt,hetrgt) , ...

最需要注意的是不能有缺测值,以及只支持二维数组吧。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表