腳本主要內容:
腳本略有缺失,完整腳本請購買施寧教授出的《NCL數據處理與繪圖實習手冊》紙質書籍。版權歸施寧教授所有。
效果如下圖所示:
另外推薦高端封面配圖的書:
由北京大學、中科院化學所等擁有物理化學生物等專業博士學位團隊製作,相關文章發表Nat.Commun./Sci. Adv./Adv. Mater.等SCI論文期刊,擁有深厚的科研背景。
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"
begin
year=ispan(1979,2013,1) ; 79/80 - 13/14
it_s=197912 ;起始年月
it_e=201411 ;結束年月
refmag = 3 ;參考箭頭所表示的風速大小
;;;read data ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; sst
time = f_sst->time ; 讀取其日期
; 轉換成公曆日期
; 截取指定時間段
;
;
;; h300
f_h300 = addfile("./data/h300-197901-201412.nc", "r")
h300 = short2flt(f_h300->hgt(rec_s:rec_e,0,{-90:90},:))
;; u850
f_u850 = addfile("./data/u850-197901-201412.nc", "r")
u850 = short2flt(f_u850->uwnd(rec_s:rec_e,0,{-90:90},:)) ; 850 hPa
;; v850
f_v850 = addfile("./data/v850-197901-201412.nc", "r")
v850 = short2flt(f_v850->vwnd(rec_s:rec_e,0,{-90:90},:)) ; 850 hPa
;; air2m
f_air2m = addfile("./data/air2m-197901-201412.nc", "r")
air2m = short2flt(f_air2m->air(rec_s:rec_e,0,{-90:90},:)) ; T at 2m
;;;DJF 平均 & 異常 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;JFM季節平均,實際是12/1/2月三個月平均,因為從1979年12月開始截取
copy_VarMeta(sst(0,:,:),sst_DJF(0,:,:))
sst_DJF!0 = "year"
sst_DJF&year=year
sst_ano = dim_rmvmean_n_Wrap(sst_DJF,0)
;; h300
h300_DJF = month_to_season(h300, "JFM")
copy_VarMeta(h300(0,:,:),h300_DJF(0,:,:))
h300_DJF!0 = "year"
h300_DJF&year=year
h300_ano = dim_rmvmean_n_Wrap(h300_DJF,0)
;; u850 與h300 同維
u850_DJF = month_to_season(u850, "JFM")
copy_VarMeta(h300_DJF,u850_DJF)
u850_ano = dim_rmvmean_n_Wrap(u850_DJF,0)
;; v850 與h300 同維
v850_DJF = month_to_season(v850, "JFM")
copy_VarMeta(h300_DJF,v850_DJF)
v850_ano = dim_rmvmean_n_Wrap(v850_DJF,0)
;; air2m
air2m_DJF = month_to_season(air2m, "JFM")
copy_VarMeta(air2m(0,:,:),air2m_DJF(0,:,:))
air2m_DJF!0 ="year"
air2m_DJF&year=year
air2m_ano = dim_rmvmean_n_Wrap(air2m_DJF,0)
;;;(3) enso index (5N-5S, 170-120W);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 0表示僅用非預設的數值進行計算
;1 表示標準化時除以的是[N] ; 而0表示除以[N-1]
;; 輸出至netcdf文件
path_out = "ENSO-index.nc"
system("rm -f "+ path_out) ; 若當前路徑下有同名文件,則刪除
ncdf = addfile(path_out,"c") ; "c" 表示創建 netCDF 文件
ncdf->ensoi = ensoi
;;;(4) composite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
nnumb = dimsizes(irec_positive)
h300_comp = dim_avg_n_Wrap(h300_ano(irec_positive,:,:),0)
u850_comp = dim_avg_n_Wrap(u850_ano(irec_positive,:,:),0)
v850_comp = dim_avg_n_Wrap(v850_ano(irec_positive,:,:),0)
air2m_comp = dim_avg_n_Wrap(air2m_ano(irec_positive,:,:),0)
;;; (5) t-test ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; sst
;; h300
h300_std = dim_variance_n_Wrap(h300_ano(irec_positive,:,:),0)
h300_std = sqrt(h300_std/nnumb)
t_h300 = h300_comp/h300_std
confi_h300 = h300_comp
confi_h300 = student_t(t_h300, nnumb-1)
;; air2m
air2m_std = dim_variance_n_Wrap(air2m_ano(irec_positive,:,:),0)
air2m_std = sqrt(air2m_std/nnumb)
t_air2m = air2m_comp/air2m_std
confi_air2m = air2m_comp
confi_air2m = student_t(t_air2m, nnumb-1)
;;; (5) plot
wks = gsn_open_wks("eps","plot-comp-enso")
gsn_define_colormap(wks,"rainbow+gray") ; 調用rainbow+gray色板,,其它色板名稱請查閱http://www.ncl.ucar.edu/Document/Graphics/color_table_gallery.shtml
base = new(3,"graphic")
plot = new(3,"graphic")
res = True ; 調整地圖及顯著性等值線, 每個子圖均需該res
res@gsnAddCyclic = True ; 添加循環點,否則會在0度經線左側出現一根白條
res@gsnDraw = False
res@gsnFrame = False
res@gsnLeftString = ""
res@gsnRightString = ""
resc = res ;拷貝
resv = res ;
rest = res ;
res@mpFillOn = False ; 不填色地圖
res@mpCenterLonF = 180 ; 地圖的中心經度
res@mpGeophysicalLineThicknessF = 0.5 ; 地圖邊界的粗細
res@pmTickMarkDisplayMode= "Always" ; 坐標上標籤上添加度符號
res@mpGridAndLimbOn = True ; 繪製經緯度線
; 經緯度線間隔
;
; 經緯度線線型取為類型為2的虛線。共17種線型供選擇。
; 其粗細
res@cnFillOn = True ; 填色等值線
res@cnLinesOn = True ; 繪製等值線
res@cnLineColor = "white" ; 顏色
res@cnLineThicknessF = 0.3 ; 粗細
res@cnLineLabelsOn = False ; 關閉標籤
; 用GMT_gray 進行填色。即調用了第2種色板
; -1 為透明
res@cnInfoLabelOn = False ; 關閉圖右下方的等值線信息標籤
res@lbLabelBarOn = False ; 關閉labelbar
resc@cnLevelSelectionMode = "ExplicitLevels" ; 指定每根需繪製的等值線
resc@cnLevels = (/-0.75,-0.25,0.25,0.75,1.25/) ;
resc@cnFillOn = False ; 關閉等值線填色
resc@cnLineThicknessF = 2. ; 等值線粗細
resc@gsnContourZeroLineThicknessF = 0. ; 設置0值線粗細。0則不畫
resc@cnLineLabelsOn = False ; 關閉標籤
resc@cnLineDashPattern = 16 ; 線型為16的虛線
resc@cnInfoLabelOn = True ; 打開圖右下方的等值線信息標籤
resc@cnInfoLabelOrthogonalPosF = 0.05 ; 移動等值線信息標籤的位置
resv@vcPositionMode = "ArrowTail" ;箭頭尾部對應著格點的位置
resv@vcGlyphStyle = "Fillarrow" ;其餘三種選項為「LineArrow」、「WindBarb」 、「CurlyVector」
resv@vcFillArrowEdgeThicknessF = 2 ; 箭頭邊界粗細
resv@vcFillArrowEdgeColor = "white" ; 及顏色
resv@vcFillArrowFillColor = "black" ; 箭頭內部填充顏色
resv@vcFillArrowWidthF = 0.1 ; 箭頭寬度
resv@vcFillArrowHeadXF = 0.6 ; 請參考附錄中Fillarrow箭頭示意圖
resv@vcFillArrowHeadYF = 0.2 ;
resv@vcFillArrowHeadInteriorXF = 0.25 ;
resv@vcMinDistanceF = 0.03 ; 箭頭之間的最小距離(在單位平方中)
resv@vcMinMagnitudeF = 1.0 ; 要繪製箭頭所表示的最小數值,即小於該數值則不繪製
resv@vcFillArrowMinFracWidthF =1.0
resv@vcFillArrowHeadMinFracXF =1.0
resv@vcFillArrowHeadMinFracYF =1.0
;****設定參考箭頭****
resv@vcRefAnnoOn = True
resv@vcRefMagnitudeF = refmag ;標準長度箭頭所表示的大小
resv@vcRefLengthF = 0.045 ;標準長度箭頭在單位平方中的大小
resv@vcRefAnnoBackgroundColor = "white" ;背景顏色
resv@vcRefAnnoPerimOn = False ;關閉邊框
resv@vcRefAnnoFontHeightF = 0.015 ;參考箭頭標籤字體大小
resv@vcRefAnnoString1On = False ;設定參考箭頭上、下的字符
resv@vcRefAnnoString2On = True ; 這裡僅設定其下方的字符
resv@vcRefAnnoString2 = refmag+" m/s"
resv@vcRefAnnoSide = "Top" ; 參考箭頭放至圖形上方
resv@vcRefAnnoOrthogonalPosF = -0.12 ; 調整其位置
resv@vcRefAnnoParallelPosF = 0.95
res@gsnCenterString = "sst" ;子圖的主標題
res@gsnCenterStringFontHeightF = 0.03 ; 標題字體的大小。由於後面沒有修改該值,則每幅圖的主標題字體均是此大小
; 只有底圖可有地圖(map)
; 調用的繪圖函數不可帶「map」
plot(0) = ColorNegDashZeroPosContour(plot(0),"blue","white","red") ; 負值用藍色虛線表示,0線用白色實線,正值紅色實線
; 帶地圖的圖必須放在最下圖層
; 繪製多邊形及折線以標明nino 3.4區
plres = True
plres@gsLineColor = "black"
plres@gsLineThicknessF = 1.0
gres = True
gres@gsFillColor = "yellow"
gres@gsFillOpacityF = 0.5
gres@gsLineColor = "black"
latx = (/-5, 5, 5, -5, -5/) ; nino3.4區的坐標位置
lonx = (/190, 190,240, 240, 190/) ;
dum1 = gsn_add_polyline(wks, base(0),lonx,latx,plres)
dum2 = gsn_add_polygon(wks,base(0),lonx,latx,gres)
res@gsnCenterString = "h300&V850"
resc@cnLevelSelectionMode = "AutomaticLevels"
resc@cnLevelSpacingF = 15.
base(1) = gsn_csm_contour_map(wks,confi_h300,res)
plot(1) = gsn_csm_contour(wks,h300_comp,resc)
plot(1) = ColorNegDashZeroPosContour(plot(1),"blue","white","red")
overlay(base(1),plot(1))
plotv = gsn_csm_vector(wks,u850_comp,v850_comp,resv)
overlay(base(1),plotv) ; 也可用gsn_csm_vector_map(wks,h300_comp,u850,v850,res_new)
res@gsnCenterString = "air2m"
resc@cnLevelSelectionMode = "ManualLevels"
resc@cnMaxLevelValF = 2
resc@cnMinLevelValF = -2
resc@cnLevelSpacingF = 0.5
base(2) = gsn_csm_contour_map(wks,confi_air2m,res)
plot(2) = gsn_csm_contour(wks,air2m_comp,resc)
plot(2) = ColorNegDashZeroPosContour(plot(2),"blue","black","red")
overlay(base(2),plot(2))
resP = True ; 繪製panel圖
resP@txString = "El nino" ; 添加主標題
resP@txFontHeightF = 0.03 ; 修改其大小
; resP@gsnPanelFigureStrings= (/"a)","b)","c)"/) ;各個子圖的標號
resP@gsnPanelFigureStringsFontHeightF = 0.015 ;字體的大小
resP@amJust = "TopLeft" ;擺放的位置,默認是「BottomRight」
; 指定每行繪製的子圖的個數
; 第1行繪製1幅,第2行繪製2幅
end