一、概述
一般,NCL脚本包含以下的内容:
1、使用load命令加载包含高水平图形接口的库函数,这一步在begin之前进行。 2、从数据文件中读数据。进行数据处理(可选)。 3、打开一个工作站(workstation)。选择一个颜色表.
4、创建一个resouce变量,各种画图的选项将作为它的属性。 5、调用合适的图形接口作图。
load \ load \
begin
in = addfile(“myfile.nc,“r“)
t = in->T wks = gsn_open_wks(“ps,ce)
gsn_define_colormap(wks,\ res = True
res@cnFillOn = True res@cnLinesOn = False res@cnLevelSpacingF = 0.5 res@gsnSpreadColors = True res@lbAutoLabelStride = True
plot = gsn_csm_contour_map_ce(wks,t,res) end
二、高水平图形接口 2.1 gsn图形接口
一般的gsn接口可以创建一般的x-y坐标,等高线,流线和矢量图。 2.2 gsn_csm接口
–可以自动的完成以下功能:
自动添加label bars,在一般的接口中需要明确的指明。自动的将变来的long_name和units属性作为图形的标签。long_name在左上角,units在右上角。还会自动的添加一些关于压力值等的其它标签。 2.3 加载接口
在begin之前用load命令加载。 gsn和gsn_csm图形接口包含在以下两个文件里。 load \ load \三、Getting Started 3.2 .hluresfile
– .hluresfile文件要位于主目录下。–在.hluresfile文件里你可以设置你的显示属性:例如:前景色、背景色:
*wkForegroundColor : (/0.,0.,0./) *wkBackgroundColor : (/1.,1.,1./) – Color map
*wkColorMap : rainbow+gray –字体:– *Font : helvetica 四、工作站(workstation)
在画图之前必须要先创建一个工作站。图形命令将作用在工作站上。工作站需要赋予一个名
字,这个名字将作为输出文件的文件名。你可以同时打开多个工作站。一个工作站只可以指定一个colormap。六种工作站:
– 1、ncgm。2、ps(postscript)。3、eps(密封的 postscript)。4、epsi(带位图预览的密封的postscript)。 5、pdf。6、X11窗口。–例:
wks = gsn_open_wks(“pdf,34_x_45) wks_2 = gsn_open_wks(“ps,myfile) 五、通过Resource画图
通过Resources我们可以修改默认的NCL图形。每个resource属性的前两个小写字母代表了 resource的类别,后面的单词首字母大写。 5.1 Resource类别
am:注释管理 cn:等高线 ca:坐标数组 gs:图像风格 lb:labelbar lg:说明
mp:maps(地图) pm:plot manager(绘图管理) pr:primitive(原型) sf:scalar field(标量场) ti:title(标题) tm:tickmarks(刻度标记) tx:text(文本) tr:transform(变换) vf:vector field(矢量场) field( ) vc:vectors(向量) vp:viewport(显示窗口) wk:workstation(工作站) ws:workspace(工作空间) xy:xy plot(xy坐标图形) 它们的详细属性请参见: http://www.ncl.ucar.edu/Document/Graphics/Resources/
5.2 给resources赋值
首先要将resources变量赋值为True。属性通过@符号来指定。下例中的res是用户自定义的。例:
res = True res@tiMainString = “my title res@cnFillOn = True
resource变量通常作为调用的图形接口的最后一个参数:例: plot = gsn_csm_contour(wks,data,res) plot2 = gsn_xy(wks,data,res)
5.3 一些常用的resources
附录A包含了常用的resource的完整的描述 5.4 画图和gsnDrawresource –默认情况下,当你调用高水平图形接口时,图形会被自动创建,除非你设定:gsnDraw=False. 5.5 推进frame和gsnFrameresource
–默认情况下,当你调用高水平图形接口,图形被创建后,图形接口会自动推进frame(如果一 frame( 个frame是书的一页的话,那么workstation就是那本书,推进frame就相当于翻过书的一页。一个workstation可以有多个frame)。除非你设定: gsnFrame=False 5.6 特殊的字符串resources,gsnLeftString, gsnCenterString,gsnRightString 在gsn_csm图形接口中,图形左上角会自动设置为数据的long_name属性,右上角会自动设置为数据的 units属性。这种行为可以通过gsnLeftString(控制左上角)、gsnCenterString(控制中间位置)和 gsnRightString(控制右上角)来改变。例:
res = True res@gsnRightString = \六、颜色设置 6.1 颜色填充
通过设置cnFillOn=True你可以为当前的等高线设置填充颜色。另外“cnFillMode=“RasterFill“表示使用光栅模式。你还需要为你的workstation指定一个color map。关于color map的跟多信息请参见: http://www.ncl.ucar.edu/Document/Graphics/color_ta bles.shtml 6.2 默认的colormap
NCL的默认的colormap包含一系列的不同的颜色。有三种方法改变colormap – 1、选择一种内置的colormap(6.3)。– 2、指定一个代表RGB数值的nX3维的数组(6.4)。– 3、指定一个包含颜色名称的数组。 6.3 内置的colormaps
有许多预定义的colormaps,可以参考以下链接:
– http://www.ncl.ucar.edu/Document/Graphics/color_tables.sh tml 你可以这样为你的workstation指定一个colormap: – gsn_define_colormap(wks,gui_default) 6.4 使用RGB数组
你可以通过RGB数组自定义一个colormap。例:
colors = (/ (/255,255,255/),\\ (/0,0,0/),\\ (/255,255,255/),\\ (/244,255,244/), \\ (/217,255,217/), \\ (/163,255,163/),\\ (/106,255,106/), (/43,255,106/),\\ (/255,127,0/) /) gsn_define_colormap(wks,colors) 第一和第二个颜色值为黑和白,分别代表前景色和背景色。 6.5 通过颜色的名称
NCL有一系列的命名好的颜色值,可以参考一下链接: http://www.ncl.ucar.edu/Document/Graphics/named_colors .shtml 例:
colors = (/ “white, “black, “white, “RoyalBlue,\\ \\
6.6 gsnSpreadColors
默认的情况下,NCL会根据要填充的等高线或矢量图的个数n选择colormap中的前n个颜色。除非你设置 gsnSpreadColors=True,这时NCL将在colormap中均匀的选择n个颜色值,比如:有10个等高线水平和200个颜色值,这时NCL会每隔20选择一个颜色值。你也可以通过设置 gsnSpreadColorStart和gsnSpreadColorEnd控制选择颜色的开始下标和结束下标。 6.7 CMYK
许多科学期刊要求论文要提供CMYK格式的图片。 CMYK也是商业印刷优先考虑的颜色模式。下面的代码将创建一个CMYK格式的图形:
type = \type@wkColorModel = \“ wks = gsn_open_wks(type,\gsn_define_colormap(wks,\– postscript文件在输出时将转换为CMYK格式。 七、向量
7.1 向量的类型
在NCL中有四种类型的向量图,可以通过 vcGlyphStyle=“type来设置: ––––“LineArrow:多条带箭头的线段,这时默认的。“FillArrow:填充的带箭头的多边形。“WindBard:使用在天气图上看到的标准的风倒钩字形。“CurlyVector:a curved polyline tangent to the instantaneous flow in the neighborhood of the grid point.
7.2 对向量图的设置
res@vcRefMagnitudeF=10.0可以设置向量的弯曲程度。 vcRefLengthF=0.045可以设置向量的长度 res@vcMinDistanceF=0.017可以设置向量的疏密程度。 7.3 向量被标量场(等高线)上色,或在标量场上上色 有四种接口可以在同一副图上画出等高线和向量。
–––– gsn_csm_vector_scalar_map_ce gsn_csm_vector_scalar_map_polar gsn_csm_vector_scalar_map gsn_csm_pres_hgt_vector
这些接口默认的行为是根据标量场的量级为向量上色。若要改变这些默认行为,可以设置resource变量的属性gsnScalarContour为True。
可以创建独立的等高线和向量图,然后使用overlay 子程序将它们结合在一起。 overlay有两个graphical类型的参数,overlay会将第二个图形结合到第一个图形上。例:
;创建向量图 res = True res@vcRefMagnitudeF = 30.0 res@vcRefLengthF = 0.045
res@vcMinDistanceF = .019 res@vcGlyphStyle = \“ res@gsnDraw = False res@gsnFrame = False res@gsnLeftString = \res@gsnRightString = \plot = gsn_csm_vector(wks,u,v,res)
;创建等高线图 resCN = True resCN@cnFillOn = True resCN@cnLinesOn = False resCN@gsnSpreadColors = True resCN@gsnDraw = False base = gsn_csm_contour(wks,data,resCN) ; overlay ;用overlay将它们结合起来 overlay(base,plot) draw(base) frame(wks)
成功创建一个overlay的关键是两个图形的坐标变量的数据是相同的。 八、地图的刻度标记
有两种类型的地图刻度标记。第一种(下图左面)是*_ce和 *_polar图形接口默认。第二种(下图右面)是4.2.0版本后添加的。你可以通过设置pmTickMarkDisplayMode = “Always“来使用第二种标记。 九、页面最大化
resource属性gsnMaximize可以自动的调整图形的大小,必要时会旋转图形以填充页面。 res@gsnMaximize = True
10、等高线
10.1 手动设置等高线的量级 需要下面四个resources
res@cnLevelSelectionMode = “ManualLevels res@cnMinLevelValF = -30 res@cnMaxLevelValF = 30 res@cnLevelSpacingF = 5
10.2 等高线效果
有许多函数和gsn resources可以设置等高线效果。 gsnContourZeroLineThicknessF可以设置基准线的宽度。 gsnContourNegLineDashPattern可以为负的等高线设置虚线模式。
有一系列的函数可以为一个等高线图形的不同部分填充不同的底纹。这些函数包含在ncl的shea_util.ncl 库文件中。你需要这样引用它: load \“ shea_util.ncl中包含函数的详细信息可以参考以下链接:
http://www.ncl.ucar.edu/Document/Functions/list_shea_util.shtml
10.3 明确的设置等高线量级
res@cnLevelSelectionMode = \ res@cnLevels = (/.01,4,7.2/)
10.4 等高线的标签
有三种等高线标签定位模式:randomized(默认)、computed和 constant。只有constant模式使标签是线的一部分。其它两种模式中线会穿过标签。可以通过设置cnLabelMasking=True来避免这种情况的发生。还可以通过cnLineLabelBackgroundColor来选择标签的背景色。 在constant模式下,cnLineDashSegLenF可以控制标签的密度。在randomized和computed模式下则是通过 cnLineLabelDensityF来控制。
十一、二维lat/lon数组
有关于二维lat/lon信息的数据可以分为两类。第一类是:已经投射到了地球的区域的数据。我们称这种为本地的网格投影。一个常见的例子是本地的兰伯特正形投影。第二类是:数据通过不规则的网格点得到,这些网格点必须通过唯一的位置来解释,但是这些数据是没有预先投影过的。有许多网格包含在这种类型里,包括曲线的网格或有限元网格。
不同的种类需要不同的技术来处理,所以如果你的数据有二维lat/lon的信息,你必须提前知道它是哪种类型的。 11.1 本地网格投影
许多GRIB和netCDF文件会包含像grid type这样的属性,它指明了投影的类型。对于其它没有这类信息的文件,你可以从数据提供者那里了解到。对于本地网格投影,第一个技术是关闭数据映射到地图上的转换。 – res@tfDoNDCOverlay = True
第二个技术是通过corners方法正确的限定地图的范围。使用这个技术时你必须知道左下角和右上角的坐标:
res@mpLimitMode = \res@mpLeftCornerLatF = 16 res@mpLeftCornerLonF = 135 res@mpRightCornerLatF = 54 res@mpRightCornerLonF = 79
有一些netCDF和GRIB文件包含的数组corners含有这些信息。最后的技术是网格的具体细节。网格本身必须被指定,一些用来定义网格的resources必须设置。例如,兰伯特正形投影需要设置两个维度,和一个经度。例: res@mpProjection=\res@mpLambertParallel1F = 30. res@mpLambertParallel2F = 55. res@mpLambertMeridianF = 45.
11.2 不规则的网格
特殊属性lon2d和lat2被用来准确的在地图上画出这类数据。创建一个符合以下特征的数据文件:
time = 1 nlat = 345 nlon = 567 float TLON (nlat,nlon) float TLAT (nlat,nlon) float ROFF (time,nlat,nlon)
接下来需要进行的处理:
tlat = f->TLAT tlon = f->TLON roff = f->ROFF roff@lon2d = tlat roff@lat2d = tlon
tlat和tlon是变量名称,并且可以被命名为任何名字,属性lon2d和lat2d是保留的,不能被更改的。明确的设置这两个属性是正确的将数据(带有二维 lat/lon信息)画出所需要的唯一条件。
十二、改变屏幕的宽高比
用两个resources:vpWidthF和vpHeightF可以改变图形的宽高比。注意:如果你要画的是一个地图,resource mpShapeMode=“FreeAspect也必须添加。 十三、镶嵌
一个镶嵌的图形包括两个或多个在同一页上进行渲染的图形对象。最常用的镶嵌方法是通过特殊的gsn接口 gsn_panel。它假设所有的图形对象都是同样大小的。它使用第一个参数的尺寸和形状来确定最终显示图形的窗口。 13.1 一个简单的例子 plot = new(2,graphic) res = True res@cnFillOn = True
res@gsnSpreadColors = True res@gsnDraw = False res@gsnFrame = False plot(0) = gsn_csm_contour(wks,u,res) plot(1) = gsn_csm_contour(wks,v,res) resP = True resP@txString = \“ gsn_panel(wks,plot,(/2,1/),resP) ;第一个参数为workstation,