爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 77388|回复: 97

[作图] MV-EOF的作图程序分享(NCL)+两个小问题

  [复制链接]

新浪微博达人勋

发表于 2017-4-7 00:59:06 | 显示全部楼层 |阅读模式

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

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

x
  1. load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
  2. load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
  3. load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/contributed.ncl"
  4. ; ==============================================================
  5. begin
  6. latS   =  0.
  7. latN   =  50.
  8. lonL   =  100.
  9. lonR   =  140.
  10. neof=2
  11. yrStrt = 1979
  12. yrLast = 2006
  13. ymStrt = yrStrt*100 +  1
  14. ymLast = yrLast*100 + 12
  15. f =addfile("/disk3/gpcp/precip.mon.mean.nc","r")
  16. fu=addfile("/disk3/ncep2/monthly/pressure/uwnd.mon.mean.nc","r")
  17. fv=addfile("/disk3/ncep2/monthly/pressure/vwnd.mon.mean.nc","r")
  18. TIME   = f->time
  19. YYYY   = cd_calendar(TIME,-1)/100                 
  20. iYYYY  = ind(YYYY.ge.yrStrt .and. YYYY.le.yrLast)
  21. pre=f->precip(iYYYY,{latS:latN},{lonL:lonR})
  22. pre=dim_standardize_n_Wrap(pre, 0, 0)
  23. precip=month_to_season(pre, "JJA")
  24. delete(TIME)
  25. delete(YYYY)
  26. delete(iYYYY)
  27. TIME   = fu->time
  28. YYYY   = cd_calendar(TIME,-1)/100                 
  29. iYYYY  = ind(YYYY.ge.yrStrt .and. YYYY.le.yrLast)
  30. uwnd=short2flt(fu->uwnd(iYYYY,{850},{latS:latN},{lonL:lonR}))
  31. uwnd=dim_standardize_n_Wrap(uwnd, 0, 0)
  32. u   =month_to_season(uwnd, "JJA")
  33. delete(TIME)
  34. delete(YYYY)
  35. delete(iYYYY)
  36. TIME   = fv->time
  37. YYYY   = cd_calendar(TIME,-1)/100                 
  38. iYYYY  = ind(YYYY.ge.yrStrt .and. YYYY.le.yrLast)
  39. vwnd=short2flt(fv->vwnd(iYYYY,{850},{latS:latN},{lonL:lonR}))
  40. vwnd=dim_standardize_n_Wrap(vwnd, 0, 0)
  41. v   =month_to_season(vwnd,"JJA")
  42. printVarSummary(v)
  43. printMinMax(v,False)
  44. ;*******************Write into one dataset*****************************
  45. ;               Combine the normalized data into one variable                                                       ;
  46. ;**********************************************************************
  47. dimw    = dimsizes(precip)
  48. mtim    = dimw(0)
  49. mlat    = dimw(1)
  50. mlon    = dimw(2)
  51. cdata   = new ( (/3*mlat,3*mlon,mtim/), typeof(v), getFillValue(v))
  52. do m1=0,mlat-1
  53.     do m2=0,mlon-1
  54.         cdata(m1,       m2,       :)=(/precip(:,m1,m2)/)
  55.         copy_VarMeta(precip,cdata(m1,       m2,       :) )
  56.         cdata(m1+mlat,  m2+mlon,  :)=(/u     (:,m1,m2)/)
  57.         copy_VarMeta(precip, cdata(m1+mlat,  m2+mlon,  :))
  58.         cdata(m1+2*mlat,m2+2*mlon,:)=(/v     (:,m1,m2)/)
  59.         copy_VarMeta(precip, cdata(m1+2*mlat,m2+2*mlon,:))
  60.     end do
  61. end do
  62. ;***************************************t*****************************
  63. ;               Compute **combined** EOF; Sign of EOF is arbitrary                                                      ;
  64. ;**********************************************************************
  65. eof_cdata    = eofunc(cdata   , neof, False)
  66. eof_ts_cdata = eofunc_ts(cdata,eof_cdata,False)
  67. printVarSummary(eof_cdata)
  68. printVarSummary(eof_ts_cdata)
  69. nvar=3                                 ;precip,u,v
  70. ceof = new( (/nvar,neof,mlat,mlon/), typeof(cdata), getFillValue(cdata))
  71. do n=0,neof-1
  72.      ceof(0,n,:,:) = eof_cdata(n,0:mlat-1,0:mlon-1)           ; precip
  73.      ceof(1,n,:,:) = eof_cdata(n,mlat:mlat*2-1,mlon:2*mlon-1) ; u
  74.      ceof(2,n,:,:) = eof_cdata(n,2*mlat:,2*mlon:)             ; v
  75.   end do
  76. ceof!0   = "var"
  77. ceof!1   = "eof"
  78. ceof!2   = "lat"
  79. ceof!3   = "lon"   
  80. ceof&lat = precip&lat
  81. ceof&lon = precip&lon
  82. printVarSummary(ceof)
  83. printMinMax(ceof(0,1,:,:),False)
  84. ;***************************************t*****************************
  85. ;               plot now                                              ;
  86. ;**********************************************************************
  87. wks=gsn_open_wks("pdf","/disk1/dzz/study/ncl/TT/MVEOF")
  88. plot = new(neof,graphic)
  89. plot2= new(neof,graphic)
  90. gsn_define_colormap(wks,"MPL_RdYlGn")
  91.   res                      = True         
  92.   res@gsnDraw              = False        ; don't draw yet
  93.   res@gsnFrame             = False        ; don't advance frame yet
  94. ; res@gsnPolar             = "SH"
  95.   res@gsnAddCyclic         = False
  96.   res@gsnMaximize          = True
  97.   res@mpFillOn             = True        ; turn off map fill
  98.   res@mpOutlineOn          = False
  99.   res@mpMinLatF            = 0
  100.   res@mpMaxLatF            = 50
  101.   res@mpMaxLonF            = 140
  102.   res@mpMinLonF            = 100

  103.   res@cnFillOn             = True         ; turn on color fill
  104.   ;res@cnFillPalette        = "BlueWhiteOrangeRed"  
  105.   res@cnLinesOn            = False        ; True is default
  106.   res@cnLineLabelsOn       = False        ; True is default
  107.   res@lbLabelBarOn         = False        ; turn off individual lb's
  108.   ;res@cnLevelSelectionMode = "ManualLevels"
  109.   ;res@cnMaxLevelValF       = -0.02
  110.   ;res@cnMinLevelValF       = 0.02
  111.   ;res@cnLevelSpacingF      = 0.005
  112.   res@cnLevelSelectionMode = "ExplicitLevels"
  113.   res@cnLevels             = (/-0.02,-0.015,-0.01,-0.005,0,0.005,0.01,0.015,0.02/)
  114.   res@cnFillColors         = (/5,25,38,56,0,0,80,94,108,121/)
  115. ; panel plot only resources
  116.   
  117.   vcres                    = True
  118.   vcres@gsnDraw            = False
  119.   vcres@gsnFrame           = False
  120.   vcres@vcRefLengthF       =0.045
  121.   vcres@vcMinDistanceF     =0.017
  122.   ;vcres@vcGlyphStyle     = "CurlyVector"

  123.   resP                     = True         ; modify the panel plot
  124.   resP@gsnMaximize         = True         ; large format
  125.   resP@gsnPanelLabelBar    = True         ; add common colorbar
  126.   resP@gsnPaperOrientation = "portrait"   ; force portrait

  127.   resP@txString            = ""

  128. ;*******************************************
  129. ; first plot
  130. ;*******************************************
  131.   do n=0,neof-1
  132.      res@tiMainString   = "MVEOF "+(n+1)
  133.      res@gsnLeftString  = "precipitation and 850hPa winds"
  134.      res@gsnRightString = ""
  135.      plot(n) =gsn_csm_contour_map(wks,ceof(0,n,:,:),res)
  136.      plot2(n)=gsn_csm_vector     (wks,ceof(1,n,:,:), ceof(2,n,:,:), vcres)
  137.      overlay(plot(n),plot2(n))
  138.      draw(plot(n))
  139.      frame(wks)
  140.   end do
  141.   gsn_panel(wks,plot,(/neof,1/),resP)     ; now draw as one plot
  142. end
复制代码
代码如上,亲测可用,重复的图为B.Wang于2008年的一篇文章“How to Measure the Strength of the East Asian Summer Monsoon”,附上MV-EOF1-2和自己用上述程序出的MV-EOF1-2(关于原图和出图略有所差别是色标定义的问题(误差可忽略)以及没有平滑的缘故,但是整体上可表现出原图的模态)。
  接下来,就是我在画图中遇到的两个问题:
  问题1:一开始我将三个变量标准化然后写入一个矩阵的时候,是按全球来写的,接着对该矩阵进行EOF变换,这样出来的图和原图差别较大,之后我用东亚夏季风区域(0-50N,100-140E),也就是原图的边界,然后再写入矩阵作EOF的时候就是和原图一样的了,所以我的问题是:NCL中的EOF函数是否和数据的经纬度信息有关?
  问题2:大家应该能看出来,我的底图和填色图之间有空隙,也就是填色图不能完全覆盖底图,我觉得问题出在数据这快,我的precip降水数据是(time,lat(72),lon(144)),然后uwnd和vwndde 数据是(time,lev,lat(73),lon(144)),也就是说降水的纬度比风场少一个格点,然后我在写入矩阵的时候,该新的矩阵维数信息定义为降水维数,所以出现这种填色图和底图有空隙,但是我要是将矩阵维数信息定义为风场维数的话,系统又会提示我:cdata(m1,       m2,       :)=(/precip(:,m1,m2)/)  这一行维数信息不对,我不知道该怎么解决,希望能有高人指点下,谢谢大家。
(风场的气旋和反气旋的“A”,“C”我就不再标上了,因为这个较为简单,官网一查即可。)

原图:FIG. 2. Spatial patterns of the (a) first and (b) second MV-EOF modes of the East Asian summer ...

原图:FIG. 2. Spatial patterns of the (a) first and (b) second MV-EOF modes of the East Asian summer ...

自己做的图:mveof1

自己做的图:mveof1

MVEOF2

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

新浪微博达人勋

 楼主| 发表于 2018-10-10 10:10:50 | 显示全部楼层
修改之后的MV-EOF

MVEOF.ncl

13.06 KB, 下载次数: 258, 下载积分: 金钱 -5

如若把多个数据合在一起后格点不同的话,可先重新插值成一致格点

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

新浪微博达人勋

发表于 2017-4-7 09:09:23 | 显示全部楼层
问题1:不只是ncl,所有的eof函数都与数据区域有关。说白了,eof就是求矩阵的特征值特征向量,矩阵变了,值和向量当然也变了
问题2:底图的范围是由mpMinLatF这四个res决定的,有空白估计是因为你的数据没有完全覆盖这个范围。比如你的数据到48.5N,底图到50N,之间就有空白了
密码修改失败请联系微信:mofangbao
回复 支持 3 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2017-4-7 01:06:03 | 显示全部楼层
附上王老师的这篇文章供大家参考!

2008王斌.pdf

1.39 MB, 下载次数: 297, 下载积分: 金钱 -5

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

新浪微博达人勋

发表于 2017-4-7 07:57:15 | 显示全部楼层
厉害
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2017-4-7 09:38:59 来自手机 | 显示全部楼层
谢谢! 昨晚睡觉的时候我突然想明白了,问的问题有点白痴o(╯□╰)o,哈哈,只是这个降水和风场格点不一致,有点难处理
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-7 16:23:19 | 显示全部楼层
eof就是求矩阵的特征值特征向量
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-10 16:52:38 | 显示全部楼层
学习了
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2017-4-10 22:43:54 | 显示全部楼层
谢谢楼主分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-10 23:05:30 | 显示全部楼层
学习
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2017-4-11 08:59:36 | 显示全部楼层
学习了。赞
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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