[ncl-talk] EOF PC timeseries

Sri nandini bax8609 at uni-hamburg.de
Tue Apr 13 06:26:32 MDT 2021


Hello ncl-users,

I have an EOF script, which im applying to my data over the 
time+ensemble level. The EOF spatial pattern comes out correctly, 
however, the timeseries does not get plotted. Could someone help me out 
with my code below?

   begin

   latS   =  20.
   latN   =  68.
   lonL   = -78.
   lonR   =  15.

   neof   = 2       ; number of EOFs
   optEOF = True
   optEOF at jopt = 0   ;uses correlation matrix to compute EOFs. The 
default is to use a covariance matrix (optEOF at jopt = 0).
   optETS = False
   yrStrt                                   = 1986
   yrLast                                   = 2006

   f     = addfile ("data.nc", "r")
    time   = f->time
    YYYY   = cd_calendar(time,-1)/100
    iYYYY  = ind(YYYY.ge.yrStrt .and. YYYY.le.yrLast)
    slp=f->hist_trend(iYYYY,:,{latS:latN},{lonL:lonR})
    printVarSummary(slp)    ;[240,100,13,24]

   slp = dtrend_msg_n(ispan(0,dimsizes(slp&time)-1,1),slp,True,False,0) 
; detrend the data
; =================================================================
; create weights:
; =================================================================
   rad    = 4.*atan(1.)/180.
   lat = f->lat({latS:latN})
    if (typeof(lat).eq."double") then
        clat = sqrt( cos(rad*tofloat(lat)) )
    else
        clat = sqrt( cos(rad*lat) )
    end if
    copy_VarCoords(lat, clat) ; contributed
    printVarSummary(clat)
; =================================================================
; weight all observations
; =================================================================
   wSLP   = slp  ; type float
   wSLP   = slp*conform(slp, clat, 2)
   printVarSummary(wSLP)
; =================================================================
; Reorder (lat,lon,time) the *weighted* input data Access the area of 
interest via coordinate subscripting
; =================================================================

   work := reshape(wSLP ,(/ntim*nens,nlat,mlon/))    ;concatanate the 
time+ensemeble dimension together to get total variance
   copy_VarCoords(wSLP(0,0,:,:), work(0,:,:))      ; trick to copy coord 
information
   printVarSummary( work )

   eof    = eofunc_n_Wrap(work,neof,optEOF,0 )
   eof_ts = eofunc_ts_n_Wrap(work, eof, optETS,0)
   printVarSummary( eof )                         ; should be [3,13,24]
   printVarSummary( eof_ts )                      ; should be [3,2400]

    eof_ts = dim_standardize_n( eof_ts, 0, 1)
   ;printVarSummary(eof_ts)

;====================================================================
;Regressnig data onto standardized PC1,2
;======================================================================

   eof_regres=eof ;create an array with meta data
   printVarSummary(eof_regres)

   do ne=0,neof-1
    eof_regres(ne,:)=(/ regCoef_n(eof_ts(ne,:), work,0,0) /)
     end do
   printVarSummary(eof_regres)

   plotfile="EOF_figure"
   wks_type = "png"
   wks = gsn_open_wks(wks_type,plotfile)
   plot                    = new(neof,graphic) ; create graphic array; 
only needed if paneling
   res                     = True
   res at mpProjection        = "LambertConformal"; choose projection
   res at gsnDraw             = False           ; don't draw
   res at gsnFrame            = False           ; don't advance frame

   res at cnFillOn            = True            ; turn on color
   res at cnLinesOn   = False                       ; turn off the contour 
lines
   res at cnLineThicknessF = 0.9
   res at cnLineColor = 0
   res at mpDataBaseVersion   = "MediumRes"
   res at cnLineLabelsOn      = False    ; turn off contour line labels

   res at cnFillDrawOrder     = "PreDraw"       ; draw contours before 
continents
   res at cnFillPalette = "BlRe"
   res at mpMinLatF            = latS           ; zoom in on map
   res at mpMaxLatF            = latN
   res at mpMinLonF            = lonL
   res at mpMaxLonF            = lonR

   res at mpOutlineOn = True                        ; turn the map outline on

   res at cnLevelSelectionMode = "ManualLevels"     ; manual set levels
   res at cnMinLevelValF       = -0.4
   res at cnMaxLevelValF       = .4
   res at cnLevelSpacingF      = 0.05                 ; 20 contour levels
res at lbLabelBarOn         = False              ; turn off individual lb's
   res at lbBoxEndCapStyle     = "TriangleBothEnds" ; Added in NCL V6.4.0
   res at lbLabelAutoStride    = True               ; Control labelbar spacing
   res at gsnMaximize          = True               ; large format in landscape
   res at gsnAddCyclic         = False              ; plotted dataa are not 
cyclic
   res at gsnMaskLambertConformal = True            ; turn on lc masking

;=============================panel plot only resources
   resP                     = True         ; modify the panel plot
   resP at gsnMaximize         = True         ; large format
   resP at gsnPanelLabelBar    = True         ; add common colorbar
   resP at lbLabelFontHeightF = 0.02
   res at gsnCenterStringFontHeightF = 0.02              ; ditto
;====================Create (but don't draw) both plots

      do n=0,neof-1
      res at gsnStringFontHeightF = 0.02
      res at gsnLeftString  = "EOF "+(n+1)
      res at gsnCenterString= "a) Hist SSH"
      res at gsnRightString = sprintf("%5.1f", eof at pcvar(n)) +"%"
      plot(n)=gsn_csm_contour_map(wks,eof_regres(n,:,:),res)
    end do
   gsn_panel(wks,plot,(/neof,1/),resP)     ; now draw as one plot

;============================================================
; time series (principal component) plot
;============================================================
    eof_ts_ens_avg at long_name = "Standardized"

    yyyymm = cd_calendar(slp&time, -1)         ; create a 
yyyy.fraction_of_year
    eof_ts_ens_avg&time = yyyymm_to_yyyyfrac(yyyymm, 0.0) ; better time axis
    ;eof_ts&time at long_name = "YEAR"
    ntim   = dimsizes(yyyymm)

    ;printVarSummary(frac)
    rts           = True
    rts at gsnDraw   = False       ; don't draw yet
    rts at gsnFrame  = False       ; don't advance frame yet
    rts at tmXBFormat= "f"         ; no unnessary decimal pts

    rts at vpHeightF = 0.40        ; Changes the aspect ratio
    rts at vpWidthF  = 0.85
    rts at vpXF      = 0.10        ; change start locations
    rts at vpYF      = 0.75        ; the plo
    rts at tiYAxisString = "Standardized"          ; y-axis label
    rts at trXMinF = 1986
    rts at trXMaxF = 2006
    rts at trYMinF = -3
    rts at trYMaxF =  3
    rts at gsnYRefLine           = 0.              ; reference line
    rts at gsnXYBarChart         = True            ; create bar chart
    rts at gsnAboveYRefLineColor = "red"           ; above ref line fill red
    rts at gsnBelowYRefLineColor = "blue"          ; below ref line fill blue

  ; panel plot only resources
    rtsP                      = True            ; modify the panel plot
    rtsP at gsnMaximize          = True            ; large format
  ; create individual plots
   do n=0,neof-1
      rts at gsnLeftString  = "EOF "+(n+1)
      rts at gsnRightString = sprintf("%5.1f", eof_regres at pcvar(n)) +"%"
      plot(n) = gsn_csm_xy (wks,work(:,0,0),eof_ts(n,:),rts)
   end do
   gsn_panel(wks,plot,(/neof,1/),rtsP)     ; now draw as one plot
end


-- 
Dr. Sri, Nandini-Weiss
Research Associate

Universität Hamburg
Center for Earth System Research and Sustainability (CEN)
Cluster of Excellence 'Climate, Climatic Change, and Society' (CLICCS)

Bundesstrasse 53, 20146 Hamburg



More information about the ncl-talk mailing list