NCL画图个例讲解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Example 1——XY plots
这个例子介绍了NCL的基础知识,例如如何开始和结束NCL脚本,如何创建和初始化变量,如何创建和绘制XY坐标图,以及如何设置resources来改变XY坐标图的外观。
此外还介绍了NCL变量包含元数据的概念,以及展示了如何从ASCII文件读取数据。
这个例子创建了5个XY坐标图。
前四个图使用了NCL脚本生成的数据,第五个图读取了ASCII文件的数据。
第一个图有一个曲线,其他图右多条曲线。
每个图相对前一个图来讲都有一些改动的地方,例如添加标题、线标签,改变线条颜色和粗细,添加标记。
在以后的例子中将有更加复杂的XY坐标图。
请注意,“line”和“curve”在这个示例中互换使用,用来表示XY坐标图的曲线。
分号“;”在NCL脚本中表示允许注释。
所有的注释都必须以分号开头,任何在分号之后和下一个换行符前的东西都将忽略。
注释可以在一行中单独出现,也可以出现在NCL命令之后。
但是在同一行注释不能出现在命令之前,因为注释符之后所有的东西都被忽略。
运行这个示例,必须下载以下文件:gsun01n.ncl,然后键入:ncl gsun01n.ncl 示例1代码及解释
1. load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" ; Load the NCL file that contains the gsn_*
载入本示例使用的包含函数和程序(以gsn开头的)的NCL脚本。
NCL中的load语句的作用和C和Fortran90程序中include作用一样。
2.; functions used below.
3. begin
每个NCL脚本都以begin声明开始,以end声明结束。
4. x = new(9,float) ; Define two 1D arrays of 9 elements each.
5. y = new(9,float)
用new语句来声明2个各有9个元素的1维浮点数组。
new语句的第一个参数表明变量的维度,第二个参数表明类型。
在这里,这两个new语句是多余的,因为在NCL中你可以通过初始化它们来声明变量(就如下两行所示)。
所有有关NCL变量类型的内容,请参见NCL Reference的“NCL data types
overview”。
6.
7. x = (/10.,20.,30.,40.,50.,60.,70.,80.,90./)
8. y = (/0.,0.71,1.,0.7,0.002,-0.71,-1.,-0.71,-0.003/)
为刚声明的两个1维数组赋值。
在赋值语句中,在以逗号分隔开的数组值之前是“/”,以“/”结束。
NCL的数组是仿照C程序语言中的数组,也就是它们都是row-major,而且从0开始(Fortran中是column-major,并且从1开始)。
9.
10. wks = gsn_open_wks("x11","gsun01n") ; Open an X11 workstation.
要NCL生成图形,就需要告诉它哪里绘制图形。
选择也就是熟知的工作站,是一个X11窗口,一个NCAR图形图元文件(NCGM),或者是PostScript文件(正常、包覆或者包覆交换regular,encapsulated or encapsulated interchange)。
gsn_open_wks函数打开上述类型的一个工作站,因此才可以在上面画图。
第一个参数(一个字符串),表示你想要绘制的图形在哪儿输出(“X11”是X11窗口,“ngcm”是NCGM,“ps”是“eps”或者“epsi”是PsotScript文件)。
第二个参数(也是一个字符串)决定了输出图像的名字(name.ncgm是NCGM文件,name.{ps,eps,epsi}是PsotScript文件,name就是输入的第二个参数。
第二个参数还有其他作用,将在例8和例9中讨论。
gsn_open_wks返回的值是图形类型的特殊变量,这个NCL的变量类型来决定图形对象。
11.
12. plot = gsn_xy(wks,x,y,False) ; Draw an XY plot with 1 curve.
gsn_xy函数用来创建并绘制XY坐标图,并且以XY坐标图图形类型变量作为返回值(大多数情况下,可以不需要理会这个返回值)。
第一个参数是你想要绘制XY坐标图的工作站(从上次调用gsn_open_wks的返回的变量)。
接下来的两个参数是想要绘制的包括X、Y数组的变量。
这两个参数可以是float、double 或integer类型,可以是一维或者多维(下面会解释)。
最后一个参数是一个逻辑值,表明是否设置任何“resources”来改变坐标图外观。
要得到NCL提供的默认的XY坐标图,将最后一个参数留为False(在NCL中,逻辑值设为特殊关键字,True或者False,开头字母必须大写)。
gsn_xy函数绘制带有刻度标记的XY坐标图。
对于默认的XY图,并没有提供标题或者X/Y轴标签,但是这些都可以很容易地添加,正如下面几个图所示。
你还可以改变刻度的格式,如例7所示。
默认情况下,当坐标图绘制到X11窗口或者NCGM文件,有一个黑色的背景和白色的前景。
如果是绘制到PostScript文件,是白色的背景和黑色的前景。
在后面的实例中,可以学到如何来设置背景和前景的颜色。
当这样做的时候,无论在什么工作站绘制,图都有一样的颜色。
一旦你打开了X11类型的工作站,gsn_xy函数就产生一个X11窗口,你需要点击鼠标左键前进到下一帧。
13.
14. ;----------- Begin second plot -----------------------------------------
在代码中分开,来表示进入第二个图的代码。
绘制带有三条曲线的XY坐标图,每条曲线有9个点。
15.
16. y2 = (/(/0., 0.7, 1., 0.7, 0., -0.7, -1., -0.7, 0./),\
17. (/2., 2.7, 3., 2.7, 2., 1.3, 1., 1.3, 2./),\
18. (/4., 4.7, 5., 4.7, 4., 3.3, 3., 3.3, 4./)/)
定义了一个3×9的数组(第一维表示曲线的数目,第二维表示点的数目)。
注意到此时并没有使用new来声明这个数组,因为在NCL可以通过赋值来创造变量。
NCL能够通过初始化来决定一个变量的维度和类型。
例如,创建一个叫做i的2×3×4的整型数组,其每个值都设为0,可以使用如下NCL语句:
i = (/ (/ (/0,0,0,0/), (/0,0,0,0/), (/0,0,0,0/) /),\
(/ (/0,0,0,0/), (/0,0,0,0/), (/0,0,0,0/) /) /)
以上的也可以用下面的两行来完成:
i = new((/2,3,4/),integer)
i = 0
在NCL中的“\”用来表示行连续符。
19.
20. x@long_name = "X" ; D efine a ttributes of x
21. y2@long_name = "Y" ; a nd y2.
NCL变量比传统程序语言如C和Fortran中使用的变量更一般。
通常,他们包含值,但它们也可能包含这个变量的辅助信息。
这种额外的信息通常被称为“元数据”。
元数据被分成三种类型:属性、命名的维和坐标变量(attributes,named dimensions和coordinate variables)。
可以给变量分配无限量的属性数目,每个分配给变量的属性都会使用“@”符号。
在20-21行,对x和y2变量都创建了叫做“long_name”的属性。
更多的NCL变量属性的信息,请参阅“Basics”中的“Variable”一节。
默认情况下,无论是X或者Y数据数组设置了名叫“long_name”的属性(在netCDF文件中通常如此),那么gsn_xy会用这个属性在XY坐标图中作为X和/或Y轴的标签(除非你通过设置resources来覆盖,如下面所示)。
22.
23. plot = gsn_xy(wks,x,y2,False) ; Draw an XY plot with 3 curves.
绘制一个新的坐标图,使用与第一个图形相同的X数组,和刚定义的新的y2数组。
因为X只是一个一维的数组,NCL将x数组的值和y2数组中三条曲线的值进行配对。
如果在3×9的Y数组以外还声明了一个3×9的X数组,那么Y数组中的每个值都会和相对应的X数组的每个值对应。
请注意,如果是在一个XY坐标图中绘制超过一条曲线的话,那么gsn_xy 会用独特的虚线类型来绘制每条曲线。
共有16种不同的虚线类型,在图形文件中查看“dash patterns”列表。
注意到由于属性“long_name”而出现的新的X和Y轴标签。
24.
25. ;----------- Begin third plot -----------------------------------------
画出相同的三条曲线,但每条曲线有不同的颜色和粗细。
26.
27. resources = True ; Indicate you want to
28. ; set some resources.
这一行引入了“resources”的概念来改变坐标图的外观。
在NCL,有上百个resources,你可以用来改变线条颜色和粗细,添加标题、改变字体、创建标签和图例、改变地图投影、改变坐标图大小、屏蔽某些区域等等。
同样还有一些resources可以用来改变坐标图的数据,例如设置最小值、最大值,选择数据的子集,或者设置缺失值等。
大多数resources有默认值,当你运行NCL脚本的时候通过NCL自动设置的。
例如,曲线的粗细的hard-coded值是1.0,但是一条曲线的最大和最小值是根据XY坐标图中用到的最大值和最小值自动设置的。
如果你想要改变默认值的话,你只有设置一个resource。
Resources通过他们的图形对象的类型或者表述的数据类型进行分类,这些分组在这里或其他示例中讲进行讨论。
为gsn_*组别的函数设置resources,首先定义逻辑类型的变量并将其值设为True,然后制定这个逻辑变量的resources。
如上所述,一个变量可以有无数个属性。
你创建的这个属性需要通过为resources设置适当的gsn_*plotting routine,使其有效。
重要说明:这一设置resources的方法是针对gsn_*组别的函数和程序的。
使用straight NCL代码设置resources是完全不同的,在“Going beyond the basics”一节中有介绍。
29.
30. resources@xyLineColors = (/2,3,4/) ; Define line colors.
设置xyLineColors的resources,为每条线定义不同的颜色。
默认值是1,这是前景色(此处是白色)。
这里制定的颜色是通过整数index值来表示的,每个index在预先定义的颜色表中对应一个颜色(通常也成为颜色图)。
因为在这个示例中没有定义颜色表,因此NCL提供了默认的有32个index的颜色涂(后面的示例将会展示如何创建自己的颜色图)。
要看这个默认的颜色表,参见NCAR Graphics Reference Manual的“Clor tables”一节。
在默认的颜色表中,整数2、3、4分别代表红色、绿色和蓝色。
颜色resources也可以用命名的颜色来设置,因此xyLineColors resources也可以用以下代码来设置:
resources@xyLineColors = (/"red","green","blue"/)
在示例4和7中将有更详细的命名的颜色。
如果你想要每条曲线的颜色一样,但希望不是“1”,那么你可以使用单数resource,xyLineColor。
XY坐标图resources属于“XyPlot”组,以“xy”开头。
每个Xy组的resource 在描述中都要说明类型和默认值。
31. resources@xyLineThicknesses = (/1.,2.,5./) ; Define line thicknesses
32. ; (1.0 is the default).
使用xyLineThicknesses resource,为每条曲线定义不同的粗细,默认的粗细是1,所以2是默认粗细的2倍,5是5倍,以此类推。
同样,你可以使用单数resource xyLineThicknessF,将所有曲线的粗细设为一样。
33.
34. plot = g sn_xy(wks,x,y2,resources) ; D raw a n XY pl o t.
绘制坐标图,此时使用刚刚创建的resources列表。
每条曲线有不同的颜色和不同的粗细。
35.
36. ;---------- Begin fourth plot ------------------------------------------
创建和前面一样的坐标图,只是在顶部添加了标题、改变了X、Y轴的标签、改变了标题和标签的子集,使用标记和/或线来绘制每条曲线。
因为是在绘制和前面一样的坐标图,希望保持和以前XY坐标图一样的resources。
你只需为resources变量添加更多的属性。
如果你想在创建下一个XY坐标图之前回到所有的默认值,你可以使用为resources使用一个新的变量名称,或者用delete(resources)命令删除当前resources 列表,并且创建一个新的列表。
37.
38. resources@tiMainString = "X-Y plot" ; Title for the XY plot
39. resources@tiXAxisString = "X Axis" ; Label for the X axis
40. resources@tiYAxisString = "Y Axis" ; Label for the Y axis
为在坐标图顶部添加标题、改变X/Y轴的标签设置一些resources。
Title resources属于“Title”组,以“ti”开头。
41. resources@tiMainFont = "Helvetica" ; Font for title
42. resources@tiXAxisFont = "Helvetica" ; Font for X axis label
43. resources@tiYAxisFont = "Helvetica" ; Font for Y axis label
为改变刚刚定义的标题的字体设置一些resources。
可以使用一个描述字体的字符串来设置字体,也可以使用字体表里的index。
有所有可用字体的名字和index值的表在NCAR Graphics Reference Manual的“Font table”可见。
请注意,预先定义的字符串,像在字体表里列出的,是不区分大小写的。
你可以用“Helvetica”或者“HELVETICA”或者其他任何大写、小写的组合来指定字体的颜色。
44.
45. resources@xyMarkLineModes = (/"Lines","Markers","MarkLines"/)
46. resources@xyMarkers = (/0,1,3/) ; (none, dot, asterisk)
使用xyMarkLineModes resource为曲线添加标记(因为默认的情况是不带标记绘制所有的曲线)。
将要绘制三种不同类型的曲线:常规线(“Lines”)、只有标记(“Markers”),带有标记的线(“MarkLines”)。
在这个坐标图中,使用resource 来调用三种类型的曲线。
XyMarker resource定义了想要使用的markers的类型,共有17种标记的类型可供选择。
47. resources@xyMarkerColor = 3 ; Marker color
48. resources@xyMarkerSizeF = 0.03 ; M arker s ize (d efault
49. ; is 0.01)
使用单数resources xyMarkerColor和xyMarkerSizeF,而不是复数的xyMarkerColors和xyMarkerSizes,所有带有标记的曲线都会有相同颜色和大小的标记。
标记默认的大小是0.01,所以0.03是默认值大小的3倍。
50.
51. plot = g sn_xy(wks,x,y2,resources) ; D raw an X Y pl o t.
用新设置的resources绘制坐标图。
52.
53. ;---------- Begin fifth plot ------------------------------------------
从ASCII文件读取数据,为标题、曲线颜色和标记线设置一些resources,
然后创建有两条曲线的XY坐标图。
54.
55. filename = "$NCARG_ROOT/lib/ncarg/data/asc/xy.asc"
56.
57. data = asciiread(filename,(/129,4/),"float")
使用NCL函数asciiread来读取ASCII文件。
NCARG_ROOT是环境变量(运行这些NCL脚本必须设置),在这个名字之前加上前缀“$”,便可以在文件路径名中使用这个环境变量了。
Asciiread的第一个参数是文件的名字,第二个参数(1个1维整型数组)是要读入的数据的维数,第三个单数(一个字符串)是数据的类型。
在此,ASCII 数据文件的数据有4列,每列有129行,因此(/129,4/)的维度读入数据。
58.
59. uv = ne w((/2,129/),float)
60. uv(0,:) = data(:,1)
61. uv(1,:) = data(:,2)
创建1个二维数组(2×129)并且给它赋值。
符号“(:,1)”表明数据中的第二套129个值(记住,NCL数组是从index0开始,不是index1)。
如果你想选择第一套的129个值中的第50-100个元素,你可以使用符号“(49:99,0)”。
62.
63. lon = da ta(:,0)
64. lon = (l on-1) * 360./128.
将数据的第一套129个值赋给变量lon。
因为变量lon中的数值范围是从1.0到129.0,但是实际上应该代表的经度值以360/128的间隔从0.0到360.0的,因此需要进行数值的转换,每个值减去1,在乘以360/128。
在NCL中,如果是标量值可以用相同的符号对整个数组进行标量计算。
你可以在一步中进行数组的乘、除、加、减,只要它们对于这样的数组计算有合适的大小。
63-64行可以合并成一行:
lon = (d ata(:,0)-1) * 360./128
65.
66. delete(resources) ; Start with new list of resources.
67.
68. resources = True
假设你不想使用前面坐标图设置的resources,你可以通过删除命令,开始一个新的resources模块。
如果打算设置一些新的resources,变量resources需要再被设为True,因为delete已经删除了与其有关的任何信息。
当然你也可以使用另一个变量名字。
69.
70. resources@tiMainString = "U/V components of wind"
71. resources@tiXAxisString = "longitude"
72. resources@tiYAxisString = "m/s"
73. resources@tiXAxisFontHeightF = 0.02 ; C hange t h e font size.
74. resources@tiYAxisFontHeightF = 0.02
为坐标图的标题、X/Y轴的标签、修改X/Y轴标签的字体大小设置一些
resources。
75.
76. resources@xyLineColors = (/3,4/) ; Set the line colors.
77. resources@xyLineThicknessF = 2.0 ; D ouble t h e w idth.
78.
79. resources@xyLabelMode = "Custom" ; Label XY curves.
80. resources@xyExplicitLabels = (/"U","V"/) ; Labels for curves
81. resources@xyLineLabelFontHeightF = 0.02 ; F ont s ize a nd c olor
82. resources@xyLineLabelFontColor = 2 ; for line labels
为定义曲线颜色粗细和创建曲线标签设置一些resources。
设置xyLabelMode 为“Custom”,表示你想要自定义XY坐标图曲线的标签(默认情况下是没有标签的)。
你可以用xyExplicitLabels resource来指明你要用的标签。
这里使用的XyLineLabel* resources,是用来改变曲线标签的字体大小和颜色。
83.
84. plot = gsn_xy(wks,lon,uv,resources) ; Draw an XY plot with 2 curves.
用刚创建的resources列表绘制XY坐标图。
85.
86. delete(plot) ; C lean up.
87. delete(resources)
使用delete命令删除这个NCL脚本中创建的变量。
在这个示例中并不必要,因为已经在NCL脚本的末尾了,但是对于养成删除不再需要的变量的习惯来讲,是一个好主意。
88. end
每个NCL脚本都以end结束。
Exmaple2——contour plots
这个示例展示如何从netCDF文件中读取数据,如何改变地图的颜色,如何创建和绘制等值线,如何打印变量,如何将数据写入到ASCII文件。
这个例子读取netCDF文件,并且用3个不同的数据的绘制了5条等值线图,为每个等值线图获得不同的类型设置了resources。
这个示例同样从netCDF向ASCII文件写入数据。
想要了解netCDF更多,参见/packages/netcdf/。
运行这个示例,必须下载以下文件:gsun02n.ncl,然后键入:ncl gsun02n.ncl 示例2代码及解释
1. load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
载入本示例使用的包含函数和程序(以gsn开头的)的NCL脚本。
NCL中的load语句的作用和C和Fortran90程序中include作用一样。
2.
3. begin
开始NCL脚本。
4.
5. cdf_file = addfile("$NCARG_ROOT/lib/ncarg/data/cdf/contour.cdf","r")
用addfile打开netCDF文件,addfile支持NCL支持的许多数据格式提供。
这些数据格式的列表,请参阅本章“Introdution”的“File input and output”。
Addfile的第一个参数(一个字符串)是文件名字,通过后缀来决定文件类型。
在这里,后缀“cdf”表明是一个netCDF文件,后缀“.nc”也是可以的。
重要说明:实际的文件名并不需要包括这个后缀,只是为了让NCL知道将要处理何种类型的文件。
如果带有后缀的文件名在指定的路径下不存在,那么NCL就要需找不带后缀的文件。
例如,如果实际文件名叫做“x”,是一个netCDF 文件,在addfile中的“x.nc”会使NCL找“x.nc”和“x”。
Addfile的第二个参数是一个字符串,表明你是要读取(“r”)、写(“w”)还是创建(“c”)这个文件。
另一个重要说明:此功能不会从netCDF文件中读取任何数据,它只是返回一个对该文件的引用。
6.
7. temp = cdf_file->T(0,0,:,:) ; t e mperature
8. Z = cdf_file->Z(0,0,:,:) ; g eopotential h eight
9. pres = cdf_file->Psl(0,:,:) ; pressure at mean sea level
10. lat = cdf_file->lat ; latitude
11. lon = c df_file->lon ; l o ngitude
现在已经对刚打开的netCDF文件有了引用,你可以进入netCDF文件中所有的变量和存储在其中的其他信息。
T、Z、Psl、lat和lon都是netCDF文件中的变量。
T和Z有四维,对应time、level、latitude和longtitude,Psl有三维,对应time、latitude和longtitude。
记住,NCL使用的是“C”类型的indexing,第一个元素是index0,从左到右的维数变化得越快。
符号“->”用来获得用addfie打开的文件中的变量。
你可以使用冒号表明选择的范围来选择数组的子集。
更多关于数组处理和选择的信息,请参阅“Introduction”一章中的“Array processing”一节。
符号“(0,0,:,:)”用来选择netCDF文件中变量T和Z的第一个时间步长和第一层。
符号“(0,:,:)”选择变量Psl的第一个时间步长。
这三个netCDF变量都存储到NCL变量temp、Z和pres中。
如果没有指定数值的范围,就如同纬度和经度变量,那么所有的值都被选中。
上述赋值语句仍然保留了netCDF变量可能包含的元数据信息,如attributes、named dimensions和coordinate variables(下面会讨论的概念)。
12.
13. temp = temp - 273.15 ; C onvert K elvin -> Celsius
14. pres = pr e s * 0.01 ; C onvert P a -> mb
使用NCL数组语句,将temp所有值从开尔文转成摄氏度,pres所有制从帕斯卡转成百帕。
因为这些变量都是以前定义的,所以它们包含了attributes、named dimensions和coordinate variables(下面会讨论的概念)。
7-8行可以和13-14行合并,如下所示:
temp = cdf_file->T(0,0,:,:) - 273.15 ; Won't r e tain m etadata
pres = cdf_file->Psl(0,:,:) * 0.01 ; of T or P sl.
但是,这个方法将不保留从netCDF文件中的任何元数据信息。
上述语句中唯一获得的就是缺失值,如果有缺失值的话(缺失值以下将会讨论)。
可以在“NCL variables overview”的“Value-only assignment”获得更多信息。
15. temp@units = "(C)" ; Change units to reflect
16. pres@units = "(mb)" ; c onversion done.
因为temp和pres的单位已经改变,上面的变动创建了“untis”变量(如果“units”变量以前不存在)来反映新的单位。
请注意,设置这个属性没有任何NCL代码的效果,但是确实是良好的编程实践来更新元数据信息,同时在标题或者标签中你可能需要这个信息。
17.
18. xwks = gsn_open_wks("x11","gsun02n") ; Open an X11 workstation.
打开一个X11工作站绘制等值线图。
19.
20. plot = g sn_contour(xwks,temp,False) ; D raw a contour pl o t.
创建并且绘制2维数组temp的等值线图。
gsn_contour函数的第一个参数是上一个调用gsn_open_wks的返回的工作站变量。
第二个参数是要画等值线的二维标量场,类型可以是float、double或者integer。
第一维必须是Y维,第二个是X。
最后一个参数是逻辑值,表明你是否设置了任何的resources。
为了得到NCL提供的默认等值线图,最后一个参数留为False。
默认绘制的等值线图包括标记的刻度线、在图的右下角带有“informational”
标签,说明等值线的范围和间距。
下一个示例说明如何关闭这个informational
标签,如何自定义刻度。
此外,因为在这个图里没有定义X/Y轴的范围,默认
的范围值是0到n-1,n是该维度中点的数量。
如果要画等值线的变量已经有“long_name”的变量,那么gsn_contour将用这个变量作为图的标题。
在此,temp有“long_name”的属性(字符串“temperature”),因此将用作标题。
如果没有“long_name”的属性,或者虽然有定义,但并不想
用作标题,你可以使用tiMainString resource来定义自己的标题。
下一个图中就
是一个例子。
21.
22. ;----------- Begin second plot -----------------------------------------
绘制第二个等值线图,这次只通过设置一些等值resources来绘制彩色的等
值线。
23.
24. resources = True ; Indicate you want to set some
25. ; resources.
使用resources来改变等值线图的外观(查阅示例1的如何设置resources的解释)。
等值线resources是“ContourPlot”组的一部分,以“cn”开头。
与等值线图有关的数据称作“标量场“,标量场resources以“sf”开头。
26.
27. resources@cnMonoLineColor = F alse ; Turn off the drawing of
28. ; contours lines in one color.
偶尔你会看到resource名字带有“Mono”。
此时,通过设置cnMonoLineColor 为False,你告诉NCL你并不想使用单一颜色的等值线图,因此使用复数resource cnLineColors来确定每条曲线的颜色。
如果cnMonoLineColor设为True,所有的曲线都会是同样的颜色。
CnLineColors resource是运行NCL脚本自动生成的resource的一个例子。
NCL决定你有多少等值层次,然后设置cnLineColors为每一条曲线有足够的颜
色index
29.
30. resources@tiMainString = "Temperature (C)" ; Create a title.
为第二个等值线图创建题目(覆盖了由“long_name”变量提供的默认的标题)。
31.
32. plot = gsn_contour(xwks,temp,resources) ; Draw a contour plot.
用设置的resources绘制一个新的等值线图。
33.
34. ;----------- Begin third plot -----------------------------------------
绘制相同的等值线,只是这次用默认的阴影类型来填充等值线。
此外,明确定义了X、Y的范围。
35.
36. resources@cnFillOn = True ; Turn on contour line fill.
37. resources@cnMonoFillPattern = False ; Turn off using a single fill
38. ; pattern.
39. resources@cnMonoFillColor = True
40. resources@cnMonoLineColor = True
默认情况下,等值线之间是没有填充的,所以当你需要填充时,设置resource cnFillOn为True。
同样在默认情况下,当你填充等值线时,它们都将用一种固定的颜色填充,因此你需要将cnMonoFillPattern设为False,告诉NCL使用对每个等值线之间使用不同的填充类型。
可用的“Fill patterns”在绘图文件中有列表。
通过设定cnMonoFillColor和cnMonoLineColor都为True,你告诉NCL对所有的填充和曲线使用同样的颜色(默认值是前景色)。
41.
42. resources@tiXAxisString = lon@long_name
43. resources@tiYAxisString = lat@long_name
使用long_name属性来为等值线图的X/Y轴创建标签。
long_name属性来自netCDF文件,当你读取lat/lon变量到本地变量时。
44. resources@sfXArray = lon
45. resources@sfYArray = lat
通过设置标量场resources sfXArray和sfYArray为1维数组lon和lat,你可以明确定义X/Y轴的范围。
46.
47. plot = gsn_contour(xwks,temp,resources) ; Draw a contour plot.
绘制等值线图。
请注意X、Y轴的新范围和新标题和X/Y轴的标签。
48.
49. ;---------- Begin fourth plot ------------------------------------------
绘制Z变量的等合资线图,用固定颜色填充等值线,在边上添加标签(label bar)。
50.
51. resources@cnMonoFillPattern = True ; Turn solid fill back on.
52. resources@cnMonoFillColor = False ; Use multiple colors.
53. resources@cnLineLabelsOn = False ; Turn off line labels.
54. resources@cnInfoLabelOn = False ; Turn off informational
55. ; label.
56. resources@cnLinesOn = False ; Turn off contour lines.
用不同颜色实心填充等值线,需要将cnMonoFillPattern重新设为True,告诉gsn_contour对所有等值线之间都是用实心填充,cnMonoFillColor设为False 得到多种填充颜色。
其他的resources关闭标签和停止绘制等值线,关闭在前面等值线图右下角的“informational”标签。
57.
58. resources@pmLabelBarDisplayMode = "Always" ; Turn on label bar.
59. resources@lbPerimOn = False ; Turn off perimeter on
60. ; label bar.
还有的时候,当你想要添加其他图形对象到等值线图,就像是label bar,图例、刻度或者标题。
在NCL中,有个被叫做“PlotManager”的东西,能够让你做到这一点。
它被称作这样是因为它管理者这些额外的对象的外观,而且试图智能化管理这些额外的东西应当绘制到原图的什么位置。
此外,如果你调整了原图的大小,这些额外的对象也会同时进行调整。
有些对象始终是在默认状态下进行
绘制,就像是刻度和标题(如果你指定了的话)。
Label bar并不是默认绘制的,因此你应当通过设置PlotManager resource pmLabelBarDisplayMode为事先定义的字符串“Always”(默认值是“Never”)告诉PlotManager将它绘制出来。
PlotManager resources以“pm”开始,laber bar resources以“lb”开头。
如示例1中指出,事先定义的字符串是不区分大小写的,因此pmLabelBarDisplayMode resource可以使“always”或“ALWAYS”或者其他任何大小写字符的着。
设置lbPerimOn resource为False表明你不想在laber bar周围绘制一个边界。
61.
62. resources@tiMainString = Z@long_name
63. resources@tiMainFont = 26
64. resources@tiXAxisFont = 26
65. resources@tiYAxisFont = 26
用Z的long_name设置了主标题。
同时改变了标题和X/Y轴标签的字体。
请参阅table of all the available fonts看它们的index值。
在这里,将字体改变成了“Times-bold”。
注意:也可以使用字体的实际名字来设置这些resource,例如用“Times-bold”来代替数字26。
66.
67. plot = gsn_contour(xwks,Z,resources) ; Draw a contour plot.
用新的数据库来绘制第四个等值线图。
请注意,等值线图里的一些地方并没有绘制。
这是因为数据中存在一些缺失值。
默认情况下,如果数据通过任何gsn_*的包含了属性“_FillValue”的图形进程,那么这个属性的值就假定为缺失值,同时,gsn_*进程将不会绘制和该值相等的数据。
缺失值将在后面的例子中更加详细的解释,你可以在NCL Reference Manua中的“NCL variables overview”一节中获得更多信息。
68.
69. ;---------- Begin fifth plot ------------------------------------------
绘制变量pres的等值线图,用实心颜色填充等值线,颜色是自己定义的灰度颜色图。
70.
71. cmap = (/(/0.,0.,0./),(/1.,1.,1./),(/.1,.1,.1/),(/.15,.15,.15/),\
72. (/.2,.2,.2/),(/.25,.25,.25/),(/.3,.3,.3/),(/.35,.35,.35/),\
73. (/.4,.4,.4/),(/.45,.45,.45/),(/.5,.5,.5/),(/.55,.55,.55/),\
74. (/.6,.6,.6/),(/.65,.65,.65/),(/.7,.7,.7/),(/.75,.75,.75/),\
75. (/.8,.8,.8/),(/.85,.85,.85/)/)
对于这个等值线图,使用灰度值来填充等值线。
为了做到这点,需要自己定义颜色图。
颜色度图通过红、绿和蓝的浮点值的数组来代表(简称RGB值),值得范围是0-1(表示特定颜色的强度)。
颜色图中的第一块是背景色,第二块是前景色。
为了得到灰度值的颜色图,对R/G/B要使用相同的值。
更多创建自己的颜色图,请参阅“Basics”一章中的“Color maps”。
76.
77. gsn_define_colormap(xwks,cmap) ; D efine a n ew c olor m ap.
使用NCL程序gsn_define_colormap来定义颜色图。
第一个参数是前一个
调用gsn_open_wks的返回的工作站变量。
第二个参数是刚在71-75行创建的颜
色图。
78.
79. resources@tiMainString = pres@long_name
80.
81. plot = gsn_contour(xwks,pres,resources) ; Draw a contour plot.
改变标题来反映等值线的新的数据,并且绘制变量pres的等值线图。
82.
83. print(temp(2:5,7:9)) ; P rint s ubset of"temp" va riable.
打印温度的子集(第一个维度中2到5的每个元素,第二个维度中7至9
的每个元素)。
打印过程需要NCL变量作为参数,并打印出来。
请注意,打印不会进行任何形式的格式化打印。
要获得格式化打印,需要用自己的C或者Fortran来创建,写在NCL wrapper上告诉NCL来调用这个程序。
更多如何为自己的C或者Fortran子程序创建wrappers,请参见“Beyond the basics”一章中的“Beyond the basics”一节。
84.
85. print(temp!0) ; P rint t h e di m ension na mes f o r t h e
86. print(temp!1) ; first two dimensions of T.
87. print(temp@long_name) ; P rint "long_name" a nd "units"
88. print(temp@units) ; attributes of "T".
89. print(temp&lat) ; Print coordinate variables "lat"
90. print(temp&lon) ; a nd "lon".
如示例1中所指,一个NCL变量可以含有关于自己的额外信息被称作“元数据”。
元数据由attributes、coordinate variables和named dimensions组成。
上述六个print语句打印了temp变量的一些元数据信息。
符号“temp!0”表明了一
个维度的维度名字,temp&lat表明coordiante variable叫做lat,temp@long_name 表明属性叫做“long_name”。
如果其中任何元数据不存在,print语句就会出现一个错误信息。
更多attributes、coordinate variables和named dimensions的信息,参见“Introduction”一章中的“Variables”一节。
91.
92. ascii_file = "data.asc" ; Create name of ASCII file.
93. system("/bin/rm -f " + ascii_file) ; Remove ASCII file.
94. asciiwrite(ascii_file,temp(7:3:2,0:4)) ; Write part of temp to ASCII
95. ; file.
使用asciiwrite将温度数据的子集写入ASCII中。
Asciiwrtie的第一个变量
是要写入数据文件的名字,第二个参数是要写入的数据。
符号“7:3:2”选择了7到3间距为2的index,所以只有index“7”、“5”和“3”选择了。
system调用作为参数的字符串,从NCL执行UNIX系统的命令。
在这种情
况下,用来在写入之前删除文件。
符号“+”,除了用作算术运算符之外,在NCL 中也可以用作链接字符串。
更多有关asciiwrite、system和其他NCL函数和程序的信息,请参阅built-in NCL functions and procedures。
96. delete(plot) ; C lean up.。