; ============================================================== ; eof_1.ncl ; ; Concepts illustrated: ; - Calculating EOFs ; - Subselecting an array using its coordinate arrays ; - Rearranging longitude data to span -180 to 180 ; - Calculating symmetric contour intervals ; - Drawing filled bars above and below a given reference line ; - Drawing subtitles at the top of a plot ; ; ============================================================== ; Calculate EOFs of the Sea Level Pressure over the North Atlantic. ; ============================================================== 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" begin ; ============================================================== ; User defined parameters that specify region of globe and ; ============================================================== latS = 25. latN = 80. lonL = -70. lonR = 40. season = "DJF" ; choose Dec-Jan-Feb seasonal mean neof = 2 ; number of EOFs optEOF = False optETS = False ; ============================================================== ; Open the file: slp data span Jan 1979 to Dec 2003 ; ============================================================== f = addfile ("SLP.1979_2003.nc", "r") slp = f->SLP ; ============================================================== ; dataset longitudes span 0=>357.5 ; Because EOFs of the North Atlantic Oscillation are desired ; use the "lonFlip" (contributed.ncl) to reorder ; longitudes to span -180 to 177.5: facilitate coordinate subscripting ; ============================================================== slp = lonFlip( slp ) ; ============================================================== ; compute desired global seasonal mean: month_to_season (contributed.ncl) ; ============================================================== SLP = month_to_season (slp, season) nyrs = dimsizes(SLP&time) ; ----------------------------------------------------------------- ; create weights: sqrt(cos(lat)) [or sqrt(gw) ] ; ----------------------------------------------------------------- rad = 4.*atan(1.)/180. clat = f->lat clat = sqrt( cos(rad*clat) ) ; gw for gaussian grid ; ----------------------------------------------------------------- ; weight all observations ; ----------------------------------------------------------------- wSLP = SLP ; copy meta data wSLP = SLP*conform(SLP, clat, 1) wSLP@long_name = "Wgt: "+wSLP@long_name ; ----------------------------------------------------------------- ; reorder (lat,lon,time) the weighted input data ; Access the area of interest via coordinate subscripting ; ----------------------------------------------------------------- x = wSLP({lat|latS:latN},{lon|lonL:lonR},time|:) eof = eofunc_Wrap(x, neof, optEOF) eof_ts = eofunc_ts_Wrap (x, eof, optETS) ; ----------------------------------------------------------------- ; Normalize time series: Sum spatial weights over the area of used ; ----------------------------------------------------------------- dimx = dimsizes( x ) mln = dimx(1) sumWgt = mln*sum( clat({lat|latS:latN}) ) eof_ts = eof_ts/sumWgt ;------------------------------------------------------------ ; PLOTS ;------------------------------------------------------------ wks = gsn_open_wks("ps","eof") gsn_define_colormap(wks,"BlWhRe") ; choose colormap plot = new(neof,graphic) ; create graphic array ; only needed if paneling ; EOF patterns res = True res@gsnDraw = False ; don't draw yet res@gsnFrame = False ; don't advance frame yet res@gsnSpreadColors = True ; spread out color table res@gsnAddCyclic = False ; plotted dataa are not cyclic ;res@gsnMaximize = True ; make image as large as possible res@mpFillOn = False ; turn off map fill res@mpMinLatF = latS ; zoom in on map res@mpMaxLatF = latN res@mpMinLonF = lonL res@mpMaxLonF = lonR res@cnFillOn = True ; turn on color fill res@cnLinesOn = False ; True is default res@lbLabelBarOn = False ; turn off individual lb's ; set symmetric plot min/max symMinMaxPlt(eof, 16, False, res) ; contributed.ncl ; panel plot only resources resP = True ; modify the panel plot resP@gsnMaximize = True ; large format resP@gsnPanelLabelBar = True ; add common colorbar resP@lbLabelAutoStride = True ; auto stride on labels yStrt = SLP&time(0)/100 yLast = SLP&time(nyrs-1)/100 resP@txString = "SLP: "+season+": "+yStrt+"-"+yLast ;******************************************* ; first plot ;******************************************* do n=0,neof-1 res@gsnLeftString = "EOF "+(n+1) res@gsnRightString = sprintf("%5.1f", eof@pcvar(n)) +"%" plot(n)=gsn_csm_contour_map_ce(wks,eof(n,:,:),res) end do gsn_panel(wks,plot,(/neof,1/),resP) ; now draw as one plot ;******************************************* ; second plot ;******************************************* ; EOF time series [bar form] rts = True rts@gsnDraw = False ; don't draw yet rts@gsnFrame = False ; don't advance frame yet rts@gsnScale = True ; force text scaling ; these four rtsources allow the user to stretch the plot size, and ; decide exactly where on the page to draw it. rts@vpHeightF = 0.40 ; Changes the aspect ratio rts@vpWidthF = 0.85 rts@vpXF = 0.10 ; change start locations rts@vpYF = 0.75 ; the plot rts@tiYAxisString = "Pa" ; y-axis label rts@gsnYRefLine = 0. ; reference line rts@gsnXYBarChart = True ; create bar chart rts@gsnAboveYRefLineColor = "red" ; above ref line fill red rts@gsnBelowYRefLineColor = "blue" ; below ref line fill blue ; panel plot only resources rtsP = True ; modify the panel plot rtsP@gsnMaximize = True ; large format rtsP@txString = "SLP: "+season+": "+yStrt+"-"+yLast year = SLP&time/100 ; create individual plots do n=0,neof-1 rts@gsnLeftString = "EOF "+(n+1) rts@gsnRightString = sprintf("%5.1f", eof@pcvar(n)) +"%" plot(n) = gsn_csm_xy (wks,year,eof_ts(n,:),rts) end do gsn_panel(wks,plot,(/neof,1/),rtsP) ; now draw as one plot end