Example 1——XY plots
这个例子介绍了NCL的基础知识,例如如何开始和结束NCL脚本,如何创建和初始化变量,如何创建和绘制XY坐标图,以及如何设置resources来改变XY坐标图的外观。此外还介绍了NCL变量包含元数据的概念,以及展示了如何从ASCII文件读取数据。
这个例子创建了5个XY坐标图。前四个图使用了NCL脚本生成的数据,第五个图读取了ASCII文件的数据。
第一个图有一个曲线,其他图右多条曲线。每个图相对前一个图来讲都有一些改动的地方,例如添加标题、线标签,改变线条颜和粗细,添加标记。在以后的例子中将有更加复杂的XY坐标图。请注意,“line”和“curve”在这个示例中互换使用,用来表示XY坐标图的曲线。
分号“;”在NCL脚本中表示允许注释。所有的注释都必须以分号开头,任何在分号之后和下一个换行符前的东西都将忽略。注释可以在一行中单独出现,也可以出现在NCL命令之后。但是在同一行注释不能出现在命令之前,因为注释符之后所有的东西都被忽略。
运行这个示例,必须下载以下文件:l,然后键入:l 示例1代码及解释
1. load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/l" ; 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文件)。第二个参数(也是一个字符串)决定了输出图像的名字(是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、doub
le 或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,
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论