【zz】ncl绘制气温分布图(完整的例子和详细的命令介绍)

【zz】ncl绘制气温分布图(完整的例子和详细的命令介绍)_第1张图片

这里几点说明:

1.ncl不支持中文显示,所有文字都是英文,但是支持很多样式的字体,参考网址http://www.ncl.ucar.edu/Document/Graphics/font_tables.shtml

2.图下方的labelbar只能在图的周围,不能放置在图内。要想显示图下方的图例,就要使用legend而不是labelbar了。

使用NCL脚本绘制一张如上图所示的png图片主要分为以下几个步骤

   一、读取各站点的气温数据。

   二、将站点数据使用各种差值函数转换成格点数据。

   三、使用源对地图进行基本设置

   四、使用源对等值线填充进行基本设置

   五、使用源对labelbar进行基本设置

   六、生成png图片

接下来将按照这几个步骤,详细介绍。

一、读取各站点的气温数据

     NCL支持的数据格式主要有netCDF文件(.nc.cdf)、HDF4(.hd.hdf)、HDF4-EOS(.hdfeos)、GRID-1/GRIB-2(.grb.grib)、CCMHistoryTape(.ecm),除此之外呢,它支持二进制文件和ascii文件,这两者是我们最熟悉的。这里我们使用ascii文件,更多文件读取方式参考http://www.ncl.ucar.edu/Applications/list_io.shtml

     为了批量生成产品图片,需要配置文件设置数据来源以及图片生成后存放位置。config.txt文件如下:

One Hour of Temperature 2010111502
./t1/
/root/WorkSpace/MICAPS_surface/t1/
10111502.000

第一行是标题
第二行是输出png图路径
第三行是输入数据文件路径
第四行是数据文件名

在NCL脚本(temperature.ncl)中使用以下几行代码就可以了

  filepath ="./config.txt"  ;参数文件路径
  argu = asciiread(filepath,-1,"string");以字符串形式读取参数文件入数组argu
  lines = asciiread(argu(2)+argu(3),-1,"string");以字符串形式读取数据文件入数组lines

  station =stringtofloat(str_get_field(lines(3::),1," ")) ;从数组lines中获取站号

  lon =stringtofloat(str_get_field(lines(3::),2," "));从数组lines中获取经度值lon

  lat =stringtofloat(str_get_field(lines(3::),3," "));从数组lines中获取纬度值lat
  height =stringtofloat(str_get_field(lines(3::),4," ")) ;从数组lines中获取海拔高度

  R  =stringtofloat(str_get_field(lines(3::),5," "));从数组lines中获取站点数据值

由于数据文件10111502.000的前3行是文件头,不包含数据,因此lines从第三行开始读取数据。注意NCL中注释使用“;”而且只能注释单行。
  这样所有数据就保存到各个变量中啦!每个变量都是一个一维数组。

 

二、将站点数据使用各种差值函数转换成格点数据。

    接下来使用插值函数,NCL中提供了很多差值函数,如Cressman插值(obj_anal_ic_deprecated)、三次样条差值(caa1)、反距离权重差值(dsgrid2)、最邻近点产值(natgrid)等等,其他插值函数参考网址http://www.ncl.ucar.edu/Document/Functions/interp.shtml

注意使用这些函数的时候要在文件头部包含contributed.ncl,即:

    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"

各个差值函数的接口不同,需要提前定义的变量也会有所差异,这里使用Cressman插值。

首先创建存放差值后生成数据的数组 根据亚洲截图的经纬度而定北纬17-57,东经72-138这个矩形框内插值
  olon = new(66,"float");
  olat = new(40,"float");
  data1 =new((/40,66/),"float")
  do i=0,65
    olon(i) =72+i
  end do
  do l=0,39
    olat(l) = 17+l
  end do

接下来设置数组属性,为了符合netcdf规定的数据格式,使函数能够识别经纬度
    olon!0         = "lon"
    olon@long_name  ="lon"
    olon@units     = "degrees-east"
    olon&lon       = olon

    olat!0         = "lat"
    olat@long_name  ="lat"
    olat@units     = "degrees_north"
    olat&lat       = olat

最后调用插值函数

 R@_FillValue =999999.000000  
  rscan =(/10,5,3/)  ;连续的有效半径大小,最大为10,依次递减

  data1 =obj_anal_ic_deprecated(lon,lat,R,olon,olat,rscan,False)  ;Creanm插值

 

三、使用源对地图进行基本设置
   首先创建一个自定义的colormap配色方案,并且创建一个工作空间,

cmap =(/                    \
           (/ 255./255, 255./255, 255./255/),   \  ; 0 - White background.
           (/ 0./255  , 0./255  ,0./255  /),       \  ; 1 - Black foreground.
           (/ 255./255, 0./255  ,0./255  /),       \  ; 2 - Red.
           (/ 0./255  , 0./255  , 255./255/),       \  ; 3 - Blue.
           (/ 164./255, 244./255, 131./255/),     \  ; 4 - Ocean Blue.
           (/ 0./255  , 0./255  ,255./255  /),        \  ; 5 - Bar 1
       (/ 0./255  , 153./255, 255./255/),     \  ; 6 - Bar 2
           (/ 0./255, 153./255, 153./255/),       \  ; 7 - Bar 3 
           (/ 0./255  , 255./255, 0./255 /),      \  ; 8 - Bar4   
           (/ 255./255, 255./255  , 102./255/),       \  ; 9 - Bar 5 
           (/ 255./255, 153./255  ,102./255  /),       \  ; 10 - Bar 6
           (/ 255./255, 0./255 

你可能感兴趣的:(ncl绘图)