爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 15387|回复: 14

[作图] ncl画风场和旋度叠加在一起,经纬度的单位设置出了问题

[复制链接]

新浪微博达人勋

发表于 2014-9-12 15:53:09 | 显示全部楼层 |阅读模式

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

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

x
想画个风场和旋杜场叠加的图,运时提示说经纬度单位出了问题,具体是哪没搞明白,运行脚本之后问题如附件中所示,我自己试过替换缺省值什么的。希望大家帮忙看一下哪里出问题了。谢谢 1.png



脚本如下:
;  Load NCL scripts
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/csm/skewt_func.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/wind_rose.ncl"

begin
  f0    =addfile("./soda_wind_curl.nc","r")
print(f0)
  
   taux1      = f0->taux_mean(time|:,lat|:,lon|:)
   tauy1      = f0->tauy_mean(time|:,lat|:,lon|:)
   rota        = f0->rota_mean(time|:,lat|:,lon|:)
   

printVarSummary(taux1)     


   lat      =f0->lat
   lon      =f0->lon
   lat@units = "degrees_north"
   lon@units = "degrees_east"
   
   taux1_mean=dim_avg_n_Wrap(taux1,0)      ;求年平均
   tauy1_mean=dim_avg_n_Wrap(tauy1,0)
   rota_mean =dim_avg_n_Wrap(rota,0)
   taux2     =dim_rmvmean_n_Wrap(taux1,0)   ;直接是三维场时减去年平均
   tauy2     =dim_rmvmean_n_Wrap(tauy1,0)
   rota1     =dim_rmvmean_n_Wrap(rota,0)
  printVarSummary(taux2)
  delete(taux2@long_name)
  delete(tauy2@long_name)
  delete(rota1@long_name)


;******************************************
;---Graphics
  wks1                = gsn_open_wks("ps","soda_wind_field_mon_mean_minus_annual_mean")
  wks2                = gsn_open_wks("ps","wind_field_annual_mean")
  
  gsn_define_colormap(wks1,"Default")
  gsn_define_colormap(wks2,"Default")  
   
  vres                 = True
  plot                = new(12,graphic)


  vres@gsnDraw         = False
  vres@gsnFrame        = False
  vres@gsnAddCyclic    = False
;  vres@vfXArray        = lon              
;  vres@vfYArray        = lat
  
  vres@gsnScalarContour     = True
  vres@cnFillOn             = True               ; turn on color for contours
  vres@cnLinesOn            = False              ; turn off contour lines
  vres@cnLineLabelsOn       = False
  vres@mpLandFillColor       = "gray"       ;加陆地边界     
  vres@mpMinLonF            = 20.25              
  vres@mpMaxLonF            = 120.75
  vres@mpMinLatF            = -33.75
  vres@mpMaxLatF            = 26.25
  
  vres@cnLevelSelectionMode   ="ManualLevels"  ;设置colorbar等距
  vres@cnMinLevelValF         =-1.6
  vres@cnMaxLevelValF         =1.6
  vres@cnLevelSpacingF        =0.1
   
  vres@vcRefMagnitudeF        = 0.04   ;设置矢量标尺
  vres@vcRefLengthF           = 0.02
  vres@vcMinDistanceF            =0.04     ; 设置向量的疏密
  vres@vcRefAnnoOrthogonalPosF = -1.0
  vres@vcRefAnnoOrientation   ="Horizontal"
              
  vres@vcLineArrowThicknessF  =0.6      
  vres@mpFillBoundarySets    ="Geophysical"
  vres@vcFillArrowWidthF      =0.02
  vres@vcVectorDrawOrder          = "PreDraw"
  
  vres@vpHeightF                 =0.4
  vres@vpWidthF                  =0.5

   
  vres@tmYRLabelsOn         = False              ; no right labels
  vres@tmYROn               = False              ; no right tickmarks
  vres@tmXTLabelsOn         = False              ; do not draw top labels
  vres@tmXTOn               = False
  vres@tmXBOn               = False
  vres@tmXBLabelsOn         = False              
  vres@tmXBOn               = False              
  vres@tmYLLabelsOn         = False              
  vres@tmYLOn               = False
   
  do i=0,1
    plot(i+1)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+1,:,:),tauy2(i+1,:,:),rota1(i+1,:,:),vres)
    plot(i+4)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+4,:,:),tauy2(i+1,:,:),rota1(i+4,:,:),vres)
    plot(i+7)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+7,:,:),tauy2(i+1,:,:),rota1(i+7,:,:),vres)
  end do


  vres@tmYLOn                 =False
  vres@tmXBOn                 =True
  vres@tmXBLabelsOn           =True
  vres@tmXBMode               ="Explicit"
  vres@tmXBValues             =(/25,40,55,70,85,100,115/)
  vres@tmXBLabels             =(/"25E","40E","55E","70E","85E","100E","115E"/)
  
  
  do i=0,1
    plot(i+10)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+10,:,:),tauy2(i+10,:,:),rota1(i+10,:,:),vres)
  end do


  vres@tmYLOn                 =True
  vres@tmYLLabelsOn           =True
  vres@tmYLMode               ="Explicit"
  vres@tmYLValues             =(/-33,-23,-13,-3,3,13,23/)
  vres@tmYLLabels             =(/"33S","23S","13S","3S","3N","13N","23N"/)

  plot(9)    =gsn_csm_vector_scalar_map_ce(wks1,taux2(9,:,:),tauy2(9,:,:),rota1(9,:,:),vres)


  vres@tmXBOn                =False
  
  plot(0)    =gsn_csm_vector_scalar_map_ce(wks1,taux2(0,:,:),tauy2(0,:,:),rota1(0,:,:),vres)
  plot(3)    =gsn_csm_vector_scalar_map_ce(wks1,taux2(3,:,:),tauy2(3,:,:),rota1(3,:,:),vres)
  plot(6)    =gsn_csm_vector_scalar_map_ce(wks1,taux2(6,:,:),tauy2(6,:,:),rota1(6,:,:),vres)
   
;panel plot   ;所有图画在一张图上
   pres               =True

   pres@gsnPanelFigureStrings= (/"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"/)  
   pres@amJust   = "BottomLeft"
;   pres@gsnPanelScalePlotIndex          = 3
;   pres@pmLabelBarOrthogonalPosF        =0.005
   pres@gsnPanelFigureStringsFontHeightF=0.01   
   pres@gsnPanelXWhiteSpacePercent      =0.0
   pres@gsnPanelYWhiteSpacePercent      =0


   pres@gsnPanelScalePlotIndex     = 7
   pres@gsnPanelLeft               = 0.1
   pres@gsnPanelRight              = 0.95
  
   gsn_panel(wks1,plot,(/4,3/),pres)
      
;   res@tmXBOn          =True
;   res@lbLabelBarOn    =True
    plot2               =gsn_csm_vector_scalar_map_ce(wks2,taux1_mean,tauy1_mean,rota_mean,vres)
  end




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

新浪微博达人勋

发表于 2014-9-12 18:38:31 | 显示全部楼层
taux1、 tauy1和 rota的坐标变量没有单位

taux1&lat@units = "degrees_north"
其它的你照着添加一下
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-9-13 10:15:03 | 显示全部楼层
longlivehj 发表于 2014-9-12 18:38
taux1、 tauy1和 rota的坐标变量没有单位

taux1&lat@units = "degrees_north"

我各个变量都添加了,然后还是会有这样的问题,而且,这样出来只有风场,并且是每个月的图下边都有一个colorbar,我要的效果是12张图是连在一块,最后只有一个colorbar。后来试了一下把rota的_Fillvalue设成了mising value,结果是只能画出旋度场,没有风场。请问下我选的这个画图的函数是不是不太合适,我试过其他的,也试过先把风场和旋度场都单独画出来,再用overlay叠加起来,但是都不成功。不知道是不是我没搞懂overlay到底怎么用。谢谢帮忙
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-9-13 10:19:59 | 显示全部楼层
threetee 发表于 2014-9-13 10:15
我各个变量都添加了,然后还是会有这样的问题,而且,这样出来只有风场,并且是每个月的图下边都有一个co ...

还是有提示经纬度缺少单位吗?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-9-13 10:22:29 | 显示全部楼层
longlivehj 发表于 2014-9-12 18:38
taux1、 tauy1和 rota的坐标变量没有单位

taux1&lat@units = "degrees_north"

刚刚忘了说,添加了单位,并且设置了missing value之后,之前的问题没有显示了,但是出现了一个新的问题:在显示taux1的一些信息后边出现了一个Warning: 2.png


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

新浪微博达人勋

 楼主| 发表于 2014-9-13 10:56:48 | 显示全部楼层
longlivehj 发表于 2014-9-13 10:19
还是有提示经纬度缺少单位吗?

没有了,我刚查了一下,那个Warning应该是不算错误的,现在风场和旋度场都画出来了,但是那个colorbar的效果不是我想要的,我只想在所有图的最右边有一个竖着的就行,麻烦你帮忙看一下我的程序还有哪里可以添加的东西,谢谢! 3.png
;********************************************************
;  Load NCL scripts
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/csm/skewt_func.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/wind_rose.ncl"

begin
;files = systemfunc("ls ./windstress*.nc")   ;批量处理
; f     =addfile("windstress01.nc","r")       ;以只读方式打开一个文件
  f0    =addfile("./soda_wind_curl.nc","r")
print(f0)

   taux1      = f0->taux_mean(time|:,lat|:,lon|:)
   tauy1      = f0->tauy_mean(time|:,lat|:,lon|:)
   rota       = f0->rota_mean(time|:,lat|:,lon|:)
   rota=rota*1e3

   if (any(isnan_ieee(rota))) then        ;isnan_ieee返回包含ieee nan的数组
      value  = 1.e20
      replace_ieeenan (rota, value, 0) ;该函数用于将nan值转换成用户指定的值 ;value是用于代替nan
      rota@_FillValue = value
   end if

printVarSummary(taux1)     

   lat      =f0->lat
   lon      =f0->lon
   lat@units = "degrees_north"
   lon@units = "degrees_east"

   taux1_mean=dim_avg_n_Wrap(taux1,0)      ;求年平均
   tauy1_mean=dim_avg_n_Wrap(tauy1,0)
   rota_mean =dim_avg_n_Wrap(rota,0)
   taux2     =dim_rmvmean_n_Wrap(taux1,0)   ;直接是三维场时减去年平均
   tauy2     =dim_rmvmean_n_Wrap(tauy1,0)
   rota1     =dim_rmvmean_n_Wrap(rota,0)
   taux1&lat@units = "degrees_north"
   taux1&lon@units = "degrees_east"
   tauy1&lat@units = "degrees_north"
   tauy1&lon@units = "degrees_east"
   rota&lat@units = "degrees_north"
   rota&lon@units = "degrees_east"
   taux2&lat@units = "degrees_north"
   taux2&lon@units = "degrees_east"
   tauy2&lat@units = "degrees_north"
   tauy2&lon@units = "degrees_east"
   rota1&lat@units = "degrees_north"
   rota1&lon@units = "degrees_east"

  printVarSummary(taux2)
  delete(taux2@long_name)
  delete(tauy2@long_name)
  delete(rota1@long_name)

;******************************************
;---Graphics
  wks1                = gsn_open_wks("ps","soda_wind_field_mon_mean_minus_annual_mean")
  wks2                = gsn_open_wks("ps","wind_field_annual_mean")

  gsn_define_colormap(wks1,"BlWhRe")
  gsn_define_colormap(wks2,"Default")  

  vres                 = True
  plot                = new(12,graphic)

  vres@gsnDraw         = False
  vres@gsnFrame        = False
  vres@gsnAddCyclic    = False   ;只有数据是全球的才需要设置成True

  vres@vfXArray        = lon              
  vres@vfYArray        = lat
  vres@sfXArray        = lon
  vres@sfYArray        = lat

  vres@cnFillOn             = True               ; turn on color for contours
  vres@cnLinesOn            = False              ; turn off contour lines
  vres@cnLineLabelsOn       = False
  vres@gsnScalarContour     = True  
  vres@gsnSpreadColors      = True
  vres@mpMinLonF            = 20.25              
  vres@mpMaxLonF            = 120.75
  vres@mpMinLatF            = -33.75
  vres@mpMaxLatF            = 26.25

;*******设置contour的属性**********************************************************  
  vres@cnLevelSelectionMode   ="ExplicitLevels"  ;设置colorbar等距
; vres@cnMinLevelValF         =-10
; vres@cnMaxLevelValF         =10
; vres@cnLevelSpacingF        =1
  vres@cnLevels               =(/-10,-8,-6,-4,-3.5,-3,-2.5,-2,-1.5,-1,-0.7,-0.4,-0.2,-0.1,0,0.1,0.2,0.4,0.7,1,1.5,2,2.5,3,3.5,4,6,8,10/)

;*******设置vector的属性***********************************************************  
  vres@vcRefMagnitudeF        = 0.04   ;设置矢量标度
  vres@vcRefLengthF           = 0.02
  vres@vcMinDistanceF            =0.04     ; 设置向量的疏密
  vres@vcRefAnnoOrthogonalPosF = -1.0              
  vres@vcLineArrowThicknessF  =0.6      
  vres@vcFillArrowWidthF      =0.02
  vres@vcVectorDrawOrder          = "PostDraw"

;******每个图形的大小***************************************************************  
  vres@vpHeightF                 =0.4
  vres@vpWidthF                  =0.5

;******各图形坐标轴属性*************************************************************
  vres@tmYRLabelsOn         = False              ; no right labels
  vres@tmYROn               = False              ; no right tickmarks
  vres@tmXTLabelsOn         = False              ; do not draw top labels
  vres@tmXTOn               = False
  vres@tmXBOn               = False
  vres@tmXBLabelsOn         = False              
  vres@tmXBOn               = False              
  vres@tmYLLabelsOn         = False              
  vres@tmYLOn               = False

  do i=0,1
    plot(i+1)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+1,:,:),tauy2(i+1,:,:),rota1(i+1,:,:),vres)
    plot(i+4)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+4,:,:),tauy2(i+1,:,:),rota1(i+4,:,:),vres)
    plot(i+7)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+7,:,:),tauy2(i+1,:,:),rota1(i+7,:,:),vres)
  end do

  vres@tmYLOn                 =False
  vres@tmXBOn                 =True
  vres@tmXBLabelsOn           =True
  vres@tmXBMode               ="Explicit"
  vres@tmXBValues             =(/25,40,55,70,85,100,115/)
  vres@tmXBLabels             =(/"25E","40E","55E","70E","85E","100E","115E"/)


  do i=0,1
    plot(i+10)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+10,:,:),tauy2(i+10,:,:),rota1(i+10,:,:),vres)
  end do

  vres@tmYLOn                 =True
  vres@tmYLLabelsOn           =True
  vres@tmYLMode               ="Explicit"
  vres@tmYLValues             =(/-33,-23,-13,-3,3,13,23/)
  vres@tmYLLabels             =(/"33S","23S","13S","3S","3N","13N","23N"/)

  plot(9)    =gsn_csm_vector_scalar_map_ce(wks1,taux2(9,:,:),tauy2(9,:,:),rota1(9,:,:),vres)

  vres@tmXBOn                =False

  plot(0)    =gsn_csm_vector_scalar_map_ce(wks1,taux2(0,:,:),tauy2(0,:,:),rota1(0,:,:),vres)
  plot(3)    =gsn_csm_vector_scalar_map_ce(wks1,taux2(3,:,:),tauy2(3,:,:),rota1(3,:,:),vres)
  plot(6)    =gsn_csm_vector_scalar_map_ce(wks1,taux2(6,:,:),tauy2(6,:,:),rota1(6,:,:),vres)

;panel plot   ;所有图画在一张图上
   pres               =True

   pres@gsnPanelFigureStrings= (/"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"/)  
   pres@amJust   = "BottomLeft"
;   pres@gsnPanelScalePlotIndex          = 3
;   pres@pmLabelBarOrthogonalPosF        =0.005
   pres@gsnPanelFigureStringsFontHeightF=0.01   
   pres@gsnPanelXWhiteSpacePercent      =0.0
   pres@gsnPanelYWhiteSpacePercent      =0
   pres@lbLabelBarOn        =True
   pres@lbOrientation       ="Vertical"
   pres@pmLabelBarHeightF     =0.6
   pres@lbLabelStride         = 1
   pres@gsnPanelScalePlotIndex     = 7
   pres@gsnPanelLeft               = 0.1
   pres@gsnPanelRight              = 0.95
   pres@txFontHeightF = 0.01
   gsn_text_ndc(wks1,"x10~S~-2",0.93,0.91,pres)

   gsn_panel(wks1,plot,(/4,3/),pres)

;   res@tmXBOn          =True
;   res@lbLabelBarOn    =True
    plot2               =gsn_csm_vector_scalar_map_ce(wks2,taux1_mean,tauy1_mean,rota_mean,vres)
  end




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

新浪微博达人勋

 楼主| 发表于 2014-9-13 11:15:57 | 显示全部楼层
longlivehj 发表于 2014-9-13 10:19
还是有提示经纬度缺少单位吗?

我都弄好了,麻烦你了哈。是我自己那个lbLabelBar设置的问题,我在最后同意画的时候不应该用这个的,而是要用这个gsnPanelLabelBar。现在都弄好了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-9-15 10:07:39 | 显示全部楼层
不知问题楼主解决了没?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-9-16 15:51:56 | 显示全部楼层
chencheng371 发表于 2014-9-15 10:07
不知问题楼主解决了没?

都解决了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-9-23 21:18:13 | 显示全部楼层
longlivehj 发表于 2014-9-13 10:19
还是有提示经纬度缺少单位吗?

你好,想请教一下你,我还是用的现在这个程序,但是换了一套数据,数据格式和之前的格式也是一样的,但是一运行到画图这里
do i=0,1
    plot(i+1)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+1,:,:),tauy2(i+1,:,:),rota1(i+1,:,:),vres)
    plot(i+4)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+4,:,:),tauy2(i+4,:,:),rota1(i+4,:,:),vres)
    plot(i+7)=gsn_csm_vector_scalar_map_ce(wks1,taux2(i+7,:,:),tauy2(i+7,:,:),rota1(i+7,:,:),vres)
  end do
就进行不下去了,不是出错,是一直显示运行的状态,但是就是出不了图,有点像是卡在这句命令这里了,我换回之前的数据是可以运行的,所以我想可能是我这个数据有问题,但是我去检查了新的数据,没发现什么问题,实在不懂这种情况除了是数据出问题还有可能是什么地方出问题,不知道你有没有遇到过这种情况。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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