急!怎样生成调节效应图中的图例(或虚或实的一根短线中间有个有的菱形是正方形或方形或圆形的实心点)?用什么软件?

<个人空间_中国最大的真人在线交友社区-51游戏社区
其他帐号登录:
真人视频交友
&2005-上海我要网络发展有限公司  沪ICP备号IDL中简单的图形显示2[转]
IDL中简单的图形显示
IDL中简单的图形显示可认为是栅格图形的一个实例。也就是说,可用Plot、Contour或Surface命令通过某种算法来点亮显示窗口内相应的像素点而形成栅格图形。这种栅格图形没有永久性。换言之,一旦IDL显示图形和点亮相应的像素点后,IDL就不知道自己做了些什么,刚才的操作并没有保存在内存中。这意味着,在用户重置图形窗口大小时,IDL无法进行相应的响应。总之,在这种模式下图形显示不能被刷新,除非再次输入图形命令。
但是,栅格图形命令在IDL中被广泛应用,因为它们简单快捷。而且读者将会看到,在仔细地用栅格图形命令编写IDL程序时,可以克服许多与栅格图形命令相关的限制。
& &另外一种被Research
Systems公司称为对象图形的图形方式在IDL5.0中被引入。对象图形使用时相对复杂一点,但它在IDL编程方面更强大更灵活。对象图形不是为了在命令行使用而开发的,而是用在IDL的程序中,特别是用于带有界面的程序中(带有图形用户界面的程序)。本书对对象图形法暂不做介绍,有兴趣的读者请参考IDL用户手册。
创建线画图
生成线画图最简单的方法是绘出一个矢量。可以用LoadData命令打开时序数据集。LoadData命令是本书所带的一个IDL程序(详细细节参考第5页的“本书中所用的IDL程序和数据文件”)。它用来装载本书的例程中所需的数据。键入如下语句以查看所能使用的数据集:
& & IDL&curve=LoadData()
如果输入LoadData命令时忘掉了括号,需要在它正常工作前重新编译LoadData程序。原因是,IDL在命令行会认为它是一个变量并进行相应地处理。重新编译后,“loaddata”这个函数名在IDL的函数名列表中。键入:
& & IDL&.Compile
时序数据是在LoadData数据列表上的第一个数据集。点击它,数据就被装入到curve变量中。另外一种选择第一个数据集的方法是,按如下方法使用LoadData:
IDL&curve=LoadData(1)
& & 要查看curve变量如何被定义,键入:
& & IDL&Help, curve
FLOAT& & =Array[101]
将发现curve是一个具有101个元素的浮点矢量(或一维数组)。
要绘出该矢量,可键入:
& & IDL&lot, curve
IDL试图用少量的信息尽可能地绘出漂亮的线画图。在这种情况下,x轴或水平轴被标识为从0到100,这与矢量中的元素个数相对应。而y轴或垂直轴则是用数据坐标来标识(它是取决于数据的坐标轴)。
但大多数情况下,线画图用于显示一组数据(独立数据)相对另外一组数据(非独立数据)的关系。例如,上面的曲线可能代表在某段时间内采集数据的信号。可能需要绘制某个时刻的信号值。在这种情况下,需要一条与该曲线矢量具有相同元素个数的矢量(这样可以获得一一对应的相关性),并将该矢量转换为实验中所用的时间单位。例如,可以创建一个时间矢量,并绘出它与上述曲线矢量的关系图:
IDL&time=FIndGen(101)*(6.0/100)
& & IDL&lot, time, curve
FIndGen命令创建一个元素值为0到100的共101个元素的矢量。乘法因子按比例缩
图1:独立数据(时间)与非独立数据(曲线)关系图。
小每个元素的大小,最后的结果是一个元素值为0到6之间的共101个元素的矢量。图形输出结果应与图1相似。
注意,在此图中的坐标轴上没有相应的标题。在图上设置标题是很容易的,只要用XTitle和YTitle关键字既可实现。例如,为此曲线图加标题,可键入:
& & IDL&lot, time, curve, XTitle='Time Axis', $
&  YTitle='Signal Strength'
甚至可以用Title关键字对整个图形设置标题,键入:
& & IDL&lot,time,curve,XTitle='Time Axis', $
&YTitle='Signal Strengh',Title='Experiment
输出结果如图2所示。
图2:简单的带坐标轴标题和图形标题的线画图
注意图形显示应该为在黑色背景下的白线图,而上图显示为在白色背景下的黑线。这些插图包含在用IDL生成的PostScript文件中。一般情况下Postscript文件把图形颜色和背景颜色反过来显示。(参考189页的“问题:PostScript设备对背景颜色和图形颜色的不同处理”。)
注意,图形标题稍微大于坐标轴的标题。事实上,是1.25倍的关系。可以用CharSize关键字改变所有图形注记的大小。例如,可以将坐标轴标题的字符放大50%:
& & IDL&lot, time, curve, XTitle='Time Axis', $
YTitle='Signal Strength', Title='Experiment 35M', $
CharSize=1.5
如果希望所有的图形显示的字符比正常情况下大,可以通过绘图系统变量上设置CharSize的大小,如下:
& & IDL&!P.CharSize=1.5
现在,所有后续的图形显示都将用较大的字符,除非用CharSize关键字在图形输出命令中特别地控制。
甚至可以用[XYZ]CharSize关键字单独改变每个轴的标识字符的大小。例如,如果想使Y轴的注记比X轴的大两倍,则可键入:
& & IDL&lot, time, curve, XTitle='Time
Axis', XCharSize=1.0, $
YTitle='Signal Strength', YCharSize=2.0
记住,[XYZ]Charsize关键字使用当前字符的大小作为基础计算出各自的大小。当前字符的大小一般储存在!P.CharSize系统变量中。这意味着,如果设置XCharSize关键字为2,当!P.CharSize系统变量也被设置为2时,字符将比平常大四倍。
定制线画图
上面是简单的线画图,除了数据本身外,没有多少其它信息。然而,有许多方法可用来定制和标注线画图。Plot函数可以被50多种不同的关键字修饰。下面的事情也许您想做一做:
1.改变线型或粗细。
2.使用符号,符号之间可以有线条和没有线条存在。
3.创建自己的绘图符号。
4.给线图加入颜色提示重要特性。
5.改变刻度标记的长度或刻度标记之间的间隔。
6.使用对数来标度图形坐标轴。
7.改变绘图范围来绘出感兴趣的数据段。
8.删除坐标轴或改变绘图方式。
改变线条的线型和粗细
例如,想用不同的线型画出数据。如画一条线型为长虚线的线条,可以这样实现:
& & IDL&lot, time, curve, LineStyle=5
对于线画图来说,可通过LineStyle关键字选用表3中列出的索引号确定不同的线型。例如,想使用虚线画出曲线,可以把LineStyle关键字的值设置为2:
& & IDL&lot, time, curve, LineStyle=2
索引号线型
表3:可以通过赋予LineStyle这个关键字不同索引号来改变线型
线画图中线的粗细同样能够被改变。例如,如果想使用比正常值粗3倍的虚线来显示图形,可键入:
& & IDL&lot, time, LineStyle=2, Thick=3
用符号代替线条表示数据
假如想用符号代替线条表示数据,就象LineStyle关键字一样,也存在类似的索引号供选择,以确定不同的线画图符号。表4给出了能通过PSym(绘图符号)关键字来选择的索引号。例如,可以通过设置PSym为2,用星号来绘图,如下:
& & IDL&plot, time, curve,
& & 输出的图形应与图3中的图形相似。
图3:用符号而不是线条来显示线画图。
索引号绘图符号
0无符号,通过线条连接点
8用户自定义符号(用UserSym过程来定义)
-PSym负值表示用线条连接相应的符号
表4:这些符号索引号可以通过PSym关键字来引用以便在绘图中使用不同的符号。注意绘图符号为负值时表示用线条来连接相应的符号。
用线条和符号来显示数据
赋予PSym关键字一个负值就可以用线条将图形符号连接起来。例如,可用实线与三角形符号绘出数据,键入:
& & IDL&lot, time, curve, PSym=-5
&&为创建一个更大的符号,可用SymSize关键字。下面的语句画出的符号为正常的两倍。符号值为4时符号的大小为正常值的4倍,依此类推。
& & IDL&Plot, time, curve,
PSym=-5, SymSize=2.0
创建自己的图形符号
如果您富有创造力,甚至可以创建自己的图形符号。UserSym命令就用于此目的。在创建了一个特殊的图形符号之后,可通过设置PSym关键字为8来选择它。以下是一个创建五角星符号的例子。
x,y矢量定义五角星的顶点,它们的值为偏离原点(0,0)的位置。可以用UserSym命令通过设置关键字Fill创建一个填充的图形符号:
& & IDL&x=[0.0, 0.5, -0.8,
0.8, -0.5, 0.0]
& & IDL&Y=[1.0, -0.8, 0.3,
0.3, -0.8, 1.0]
& & IDL&TvLCT, 255, 255, 0,
& & IDL&UserSym, x, y,
Color=150, /Fill
& & IDL&Plot, time, curve,
PSym=-8, SymSize=2.0
& & 输出结果应与图4相似。
图4:用UserSym程序创建的符号来绘制线画图。
用不同的颜色绘制线画图
可以用不同的颜色绘制线画图(颜色将在第83页的“IDL的颜色运用”中详细讨论。现在,只须按如下键入TvLCT命令即可,以后将学到这个命令意味着什么。实质上,该语句表示装载了三个颜色矢量,每个矢量的三个分量分别代表颜色的三个组成部分红,绿,蓝。该语句的三种颜色矢量分别表示碳灰、黄、绿色。)例如将颜色索引号1、2和3分别设置为碳灰,黄,绿色,键入:
& & IDL&TvLCT, [70,255,0],
[70,255,255], [70,0,0], 1
& & 在碳灰背景下绘黄色图,键入:
& & IDL&Plot, time, curve,
Color=2, Background=1
如果只是想使线条成为不同的颜色,首先必须将NoData关键字打开来绘图,然后用OPlot命令(下面要讨论的)覆盖该图。例如,在碳灰色背景上绘制黄色外框,数据用绿色显示,键入:
& & IDL&Plot, time, curve,
Color=2, Background=1, /NoData
& & IDL&OPlot, time, curve,
限定线画图的范围
并非所有的数据都必须在一个线画图中绘出,可以用关键字限定绘图的数据量。例如,可仅绘出位于X轴上2至4之间的数据,键入:
& & IDL&Plot, time, curve,
XRange=[2, 4]
或者仅绘出Y值在10至20之间,X值在2至4之间的部分数据图形,键入:
& & IDL&Plot, time, curve,
YRange=[10, 20], XRange=[2, 4]
也可以通过给定关键字数据范围来反转数据的方向。例如,可将Y轴的0点设置为图形的顶端,如下:
& & IDL&Plot, time, curve,
YRange=[30, 0]
输出结果应与图5相似。
如果所选择的轴的范围不适合IDL关于坐标轴美观标记的规定,IDL将忽略所要求的范围。试一试如下的命令:
& & IDL&Plot, time, curve,
XRange=[2.45, 5.64]
X轴上显示的范围将是从2至6,这并不是对IDL所要求的精度。为确保轴上显示的范围正如所要求的那样,可将XStyle关键字设置为1,如下:
& & IDL&Plot, time, curve,
XRange=[2.45, 5.64], XStyle=1
下一节将学到更多关于[XYZ]Style关键字的知识。
图5: 将Y轴0点设置为图形顶端的图形
改变线画图的风格
可以方便地改变线画图的许多特性,包括它们的外观形式。例如,读者可能不需要显示线画图的方框。如果是这样,可以用[XYZ]Style这些关键字改变线画图的特性。表5给出了可通过这些关键字来改变线画图风格的值。例如,为除去方框线,只留下X轴或Y轴,可键入:
& & IDL&Plot, time, curve,
XStyle=8, YStyle=8
值对坐标轴的影响
1精确的坐标轴范围
2扩展坐标轴范围
4不显示整个坐标轴
8不显示外框(只画坐标轴)
16屏蔽Y轴起始值为0的设置(只有Y轴有此属性)
表5:[XYZ]Style关键字参数表,用于设置坐标轴的属性。注意:这些值可以累加从而设置坐标轴的多个而非单个属性。
可以完全隐藏一个轴。例如,仅用Y轴显示图形,可键入:
& & IDL&Plot, time, curve,
XStyle=4, YStyle=8
& & 输出结果应与图6相似:
图6: 关闭X轴和方框只剩Y轴的线画图
& & 可以用Y轴和Y方向的网格线来显示同一幅图:
& & IDL&Plot, time, curve,
XStyle=4, YTickLen=1, YGridStyle=1
[XYZ]Style关键字可以一次设置坐标轴的多个特性。可以通过累加适当的值来实现。例如,可以从表5中看出,强制使用精确的坐标轴范围的参数值为1,而用来删除方框线的参数值为8。为实现上述两项功能,即让X轴显示精确的范围又隐藏方框线,可将两个参数值相加:
& & IDL&plot, time, curve,
xstyle=8+1, xrange=[2, 5]
在线画图上创建网格线,通常可用TickLen关键字来完成。如下:
& & IDL&Plot, time, curve,
将[XYZ]TickLen关键字设置为一个负值可以创建向外的刻度标记。例如,为创建向外的刻度标记,可键入:
& & IDL&Plot, time, curve,
TickLen=-0.03
在某个轴上创建向外的刻度标记,可将[XYZ]TickLen关键字设置为一个负值。例如,只在X轴上创建向外的刻度标记,键入:
& & IDL&Plot, time, curve,
XTickLen=-0.03
可以用[XYZ]Ticks和[XYZ]Minor关键字,在一个轴上选择主要的和次要的刻度标记的个数。例如,在X轴上创建两个主要的刻度间隔,每个主要的刻度间隔内设置10个次要的刻度标记,键入:
& & IDL&Plot, time, curve,
XTicks=2, XMinor=10, XStyle=1
在线画图上绘出多种数据集
&您可以不仅仅用一组数据绘制线画图。IDL程序允许在同一套坐标轴内显示任意多套数据。OPlot命令就用于此。键入以下命令,输出结果应与图7相似:
& & IDL&Plot, curve
& & IDL&OPlot, curve/2.0,
LineStyle=1
IDL&OPlot, curve/5.0, LineStyle=2
初始的Plot命令为以后的绘图建立数据比例(!X.S和!Y.S是比例参数)。或者说,
!X.S和!Y.S系统变量告诉IDL如何在数据范围内取点以及如何将该点显示在设备坐标空间上。要确保初始图形有足够的轴长,以便包容以后绘制的所有图形,否则数据将被裁剪掉。可在第一个Plot命令中用XRange和YRange关键字来创建一个足够大的数据范围。为区别不同的数据集,可用不同的线型,不同的颜色,不同的图形符号等。Oplot命令接受很多被Plot命令接受的关键字。
& & IDL&TvLCT, [255, 255, 0],
[0, 255, 255], [0, 0, 0], 1
& & IDL&Plot, curve,
& & IDL&OPlot, curve,
& & IDL&OPlot, curve/2.0,
IDL&OPlot, curve/5.0, Color=3
图7:在同一个线画图上可以绘制无限多套数据集
图8:具有两个Y轴的线画图。第二轴是用Axis命令来定位的。一定要用Save关键字来将数据比例保存起来
在多个轴的图上显示数据
有时,希望在同一个线画图上显示两个或多个数据集,并用不同的y轴表示不同的数据集。使用Axis命令很容易建立所需数量的坐标轴。使用Axis命令的关键是使用save关键字来存储正确的绘图比例参数(即存储在!X.S和!Y.S系统变量中的比例参数),以便后续图形的调用。
下面的例子在已绘出一幅图后,用带Save关键字的Axis命令建立第二个Y轴。OPlot命令中的曲线将调用通过Axis命令保存的比例因子,以确定其在图形中的位置。正确的命令是如下:
& & IDL&Plot, curve, YStyle=8,
YTitle='Solid Line', $
&Position=[0.15, 0.15, 0.85, 0.95]
& & IDL&Axis, YAxis=1,
YRange=[0, Max(curve*5+1)], /Save, $
&YTitle='Dashed Line'
& & IDL&OPlot, curve*5,
LineStyle=2
Position关键字用来确定第一个图形在页面内的位置。为了解更多关于Position关键字的知识,可参阅第48页的“在图形显示窗口中确定图形输出位置”章节。输出图形应与图8相似。
创建曲面图
在IDL程序中,任何二维的数组都可以用Surface命令生成一个曲面图(经过自动消隐)。首先,必须打开数据文件,用LoadData命令打开
Elevation Data数据集。键入:
& & IDL&peak=LoadData(2)
通过键入Help命令,可以发现这是一个41*41的浮点数组。键入:
& & IDL&Help, peak
& & 这个数组可以通过Surface命令使之曲面化:
& & IDL&Surface, peak,
CharSize=1.5
输出结果应与图9相似。
图9:利用高程数据生成简单的曲面图。
注意,如果仅用单个数组作为变量调用Surface命令,它将把该数组作为其元素个数(此例在X和Y方向都为41)的函数来绘图。(可以使用CharSize关键字来改变字符的大小,以便更容易看清楚)。但是,正如前面使用Plot命令一样,可以规定X和Y轴的数值,以便显示的图形具有实际意义。例如,X和Y轴的数值可以是经纬度坐标。这里,使纬度范围为从24度到48度,经度范围为-122度到-72度:
IDL&lat=FIndGen(41)*(24./40)+24
IDL&LON=FIndGen(41)*50.0/41-122
& & IDL&Surface, peak, lon,
lat, XTitle='Longitude', $
&YTitle='Latitude', ZTitle='Elevation',
CharSize=1.5
输出结果应与图10相似。
图10:一个具有实际意义坐标值的曲面图。
以上命令中的lon和lat参数是单调递增并且是规则的。它们描述了曲面网格线的位置。但网格没有必要是规则的。试想一下,如果使经度数据点不规则分布会出现什么情况。例如,可以键入以下命令模拟随机分布的经度点:
IDL&seed=-1L
& & IDL&newlon=RandomU(seed,
IDL&newlon=newlon[Sort(newlon)]*(24./40)+24
& & IDL&Surface, peak, newlon,
lat, XTitle='Longitude', $
&&&YTitle='Latitude',
ZTitle='Elevation', CharSize=1.5
现在发现经度X值是没有规则分布的。尽管看起来数据被重新取样了,然而却不是。IDL能很容易地在经度和纬度数据点指定的位置处画出曲面图的网格线。输出结果应与图11相似。
图11:同样的曲面图,但其X矢量具有不规则的空间分布
定制曲面图
有70多个不同的关键字可以用来定制曲面图。实际上,许多关键字在Plot命令中已经学过。例如在上面的代码中,就使用了相同的标题关键字对曲面图的轴进行标记。然而要注意,当用Title关键字时,所添加的标题被旋转了,从而保证标题总是位于曲面图的XY平面内。键入:
& & IDL&surface, peak, lon,
lat, XTitle='Longitude', $
&&&YTitle='Latitude',
Title='Mt.Elbert', Charsize=1.5
&但所得图形并非总是我们希望得到的。如果想使图形标题位于与显示窗口平行的平面内,就必须用Surface命令绘制曲面图,而用XYOutS命令显示标题(第55页有关于XYOutS命令的详细信息)。比如,键入:
IDL&Surface,&&peak,&&lon,&&lat,&&Xtitle=’Longitude’,&&$
&Ytitle=’Latitude’,&&Charsize=1.5
XYOutS,&&0.5,&&0.90,&&/Normal,&&Size=2.0,&&Align=0.5,&&$
&‘Mt.Elbert’
旋转曲面图
在观察曲面图时可能希望能将曲面图旋转一个角度。曲面图可以用Ax关键字使其绕X轴或用Az关键字使其绕X轴旋转。当从轴上的正值向原点观察时,曲面图以逆时针方向,按某个角度值旋转。当Az和Ax关键字被忽略时其缺省值是30度。例如,使曲面图绕Z轴旋转60度,绕X轴旋转35度,则可键入:
Surface,&&peak,&&lon,&&lat,&&Az=60,&&Ax=35,&&Charsize=1.5
& & 输出结果应与图12相似。
图12:用Az和Ax关键字使曲面图旋转
为曲面赋色
有时,可能想为曲面图上赋上颜色以强调某种特性。给曲面图着色是很简单的,只需使用在线画图中用过的赋色关键字即可。(颜色将在第83页的“IDL的颜色运用”中详细讨论。现在,只须按如下键入TvLCT命令即可,以后将学到这个命令意味着什么。实质上,装载了三个颜色矢量,每个矢量的三个分量分别代表颜色的三个组成部分红,绿,蓝。这三种颜色矢量为碳灰,黄,绿色)。例如,在碳灰色背景上创建一个黄色的曲面图,可键入:
TvLCT,&&[70,&&255,&&0],&&[70,&&255,&&255],&&[70,&&0,&&0],&&1
Surface,&&peak,&&Color=2,&&Background=1
如果想使曲面图的底面的颜色不同于顶面,比如说绿色,可以使用Bottom关键字来实现:
& & IDL&Surface, peak,
Color=2, Background=1, Bottom=3
如果想将轴以不同的颜色显示,比如绿色,而不是曲面,必须键入两个命令。第一个命令使用NoData关键字,只将轴绘出。第二个命令是在关闭轴线后绘出曲面本身。查看第31页的表5,了解[XYZ]Style关键字的参数值及其含意:
& & IDL&Surface, peak,
Color=3, /NoData
& & IDL&Surface, peak,
/NoErase, Color=2, Bottom=1,XStyle=4, YStyle=4, ZStyle=4
用不同的颜色画出曲面的格网线也是有可能的,而不同的颜色代表不同的数据。比如,可用第二个数据集覆盖第一个,第二个数据集含有对第一个数据集的格网进行着色后的信息。
& & 为了说明如何工作,可打开一个名为Snow
Pack的数据集,并用以下这些命令将此数据作为一个曲面显示。注意,Snow
Pack数据集的大小与peak数据集一样,都是41*41浮点数组:
& & IDL&snow=LoadData(3)
& & IDL&Help, snow
& & IDL&Surface, snow
现在,通过用snow的变量值对peak变量的格网着色,将snow变量中的数据覆盖到peak变量中数据的上面。首先,用LoadCT命令装载彩色表内的一些颜色。实际的阴影处理是通过shades关键字完成的,如下:
& & IDL&LoadCT, 5
& & IDL&Surface, peak,
Shades=BytScl(snow, Top=!D.Table_Size-1)
注意,必须用BytScl命令将snow数据集调整为所使用IDL时的色彩数。如果调整失败,只能看到一套坐标轴,而看不到曲面显示。这是因为,数据必须调整到曲面阴影处理时所需的0到255的范围。
修改曲面图外观
有很多关键字可以用来修改曲面图的外观或形式。例如,可以显示一个带边缘的曲面图。使用Skirt关键字来指定边缘该画到何处。试试下面命令:
& & IDL&Surface, peak,
& & IDL&Surface, peak,
Skirt=500, Az=60
图13:带边缘的曲面图
上面第一个命令的输出结果应与图13相似。
如果仅绘出水平线,获得一种层叠线形图,比如,键入:
& & IDL&Surface, peak,
/Horizontal
如果愿意,可以通过关键字来只显示曲面的底面或顶面,而不是两者都显示(缺省是两者都显示)。键入:
& & IDL&Surface, peak,
/Upper_Only
& & IDL&Surface, peak,
/Lower_Only
有时可能只想显示曲面本身,而不需要轴线。 可键入:
& & IDL&Surface, peak,
XStyle=4, YStyle=4, ZStyle=4
创建阴影曲面图
创建阴影曲面图同样很简单,可使用Gouraud光源阴影算法创建阴影曲面图,键入:
& & IDL&Shade_Surf, peak
Shade_Surf命令接受大多数被Surface命令接受的关键字。例如,如果想旋转阴影曲面,可以键入:
& & IDL&Shade_Surf, peak, lon,
lat, Az=45, Ax=30
输出图形应与图14相似。
图14: 用Gouraud光源阴影算法生成的阴影曲面图
改变阴影处理参数
用Set_Shading命令可以改变Shade_Surf命令所使用的阴影处理参数。例如,要将光源的光线的方向从平行Z轴的默认值[0,0,1]改变为平行X轴的方向[1,0,0],可键入:
& & IDL&Set_Shading, Light=[1,
& & IDL&Shade_Surf, peak
也可以从彩色表中挑选某种颜色索引号用作阴影处理。例如,当想把红色彩色表(彩色表3)装载到颜色索引号100到199之中,并将之用于阴影处理,可键入:
& & IDL&LoadCT, 3,
NColors=100, Bottom=100
& & IDL&Set_Shading,
Values=[100, 199]
& & IDL&Shade_Surf, peak
注意将光源位置和颜色参数恢复原值,否则继续操作,可能会造成混乱。
& & IDL&LoadCT,5
& & IDL&Set_Shading,
Light=[0,0,1], Value=[0,!D,Table_Size-1]
用其它数据集为阴影处理提供参数
首先,就象Surface命令一样,其它数据集也可以为阴影处理时的各数据点提供颜色值。正如前述,可以用Shades关键字为曲面上各点指定颜色索引号。每个像素点的阴影处理都是根据该点周围数据值通过插值求出。例如,下面是一个用snow变量生成的阴影曲面图:
& & IDL&Shade_Surf, snow
现在用这个数据集来对最初的高程数据集进行阴影处理,键入:
IDL&Shade_Surf,peak,lon,lat, Shades=BytScl(snow,
Top=!D.Table_Size)
& & 输出结果应如图15所示:
图15:用snow数据集对peak数据进行阴影处理
如果要求根据数据点的高程值来对曲面进行阴影处理,可简单地对数据集本身进行字节比例缩放即可,键入:
& & IDL&Shade_Surf, peak,
Shades=BytScl(peak, Top=!D.Table_Size)
将另一数据集覆盖在曲面图上是一种给数据升维的方法。例如,可将一组数据集覆盖在一个三维曲面图上,就可以直观的获得四维的信息。如果同时让两组数据集合随时间活动起来,就可以直观的获得五维信息。(关于数据动画参阅104页的“IDL的动画数据”)
有时只是想将原始曲面覆盖在经过阴影处理的曲面图上,通过结合使用Shade_Surf命令和Surace命令可轻松的做到。例如:
& & IDL&Shade_Surf, peak
& & IDL&Surface, peak,
创建等值线图
在IDL中,任意二维数组都可以用一个Contour命令显示为等值线图。如果已经在这次IDL运行中定义了peak变量,可直接使用该变量。如果没有定义,可以使用LoadData命令来载入Elevation
Data中的数据集。键入:
& & IDL&peak=LoadData(2)
& & IDL&Help, peak
这个数据集通过一个简单的命令即可显示为等值线图(图16):
& & IDL&Contour, peak,
CharSize=1.5
图16:一个基本的等值线图,注意X、Y轴的标记代表该数组中的元素个数
 注意,如果仅用单个二维数组作为参数调用Contour命令,它将把该数组作为其元素个数(此例在X和Y方向都为41)的函数来绘图。如前述所用Surface命令一样,可以指定X轴和Y轴的数值,以便使其具有实际意义。例如,可以象前述一样使用经度和纬度矢量。如下所示:
IDL&lat=FIndGen(41)*(24./40)+24
IDL&lon=FindGen(41)*50.0/40-122
& & IDL&Contour, peak, lon,
lat, XTitle='Longitude', $
YTitle='Latitude'
注意轴被自动缩放了。从很多地方可以看到这一点。首先,等值线没有延伸到等值线图的边缘,其次,可以发现轴上的标记与lon矢量和lat矢量的最小值和最大值不同。
& & IDL&Print, Min(lon),
& & IDL&Print, Min(lat),
为了防止轴的自动缩放,可以设置XStyle和YStyle关键字,如下:
& & IDL&Contour, peak, lon,
lat, XTitle='Longitude', $
&&&YTitle='Latitude',
XStyle=1, YStyle=1
该命令得到图形应如图17所示。
图17:具有实际数量意义的等值线图
在早期的IDL版本中,Contour
命令使用所说的单元画法来计算并绘出数据的等值线。在这种方法中,等值线图是从图底画到图顶。这种方法是有效的,但是它不允许选项,比如标注等高线。而单元跟踪法被用来完整地画出围绕等值线图的每一条等值线。这需要较长的时间,但可以允许对等值线作更多的控制。例如,等值线可以断开用于等值线的标注。这种单元跟踪法可以用Follow关键字来调用:
& & IDL&Contour, peak, lon,
lat, XStyle=1, YStyle=1, /Follow
从IDL5版本开始,Contour命令一般都使用单元跟踪法来绘制等值线图。所以,Follow关键字已经过时了。但该关键字仍然被使用,是因为它对自动标注其它每条等值线的有益作用。
选择等值线数目
缺省情况下,IDL选择6条匀称的等值线间隔(即有5条等值线)绘制等值线图。但是,可以用几种不同的方法改变缺省值。例如,可以用Nlevels关键字告诉IDL需要绘制多少条等值线。IDL将计算出等间隔的等值线间隔数。例如,要绘制具有12条等间隔的等值线图,可键入:
IDL>Contour, peak, lon, lat, Xstyle=1, Ystyle=1, /Follow, $
&&&Nlevels=12 
输出结果应与图18相似。可选择高达29条的等值线。
图18:这是将等值线级别设置为12的等值线图。注意,每隔一条等值线都会标注一条,这是使用Follow关键字的一种副作用。
不幸的是,尽管IDL文档称IDL将采用给定的等间隔的等值线间隔数,但事实上不是这样。如果注意观察所创建的等值线图,会注意到IDL只计算出少于12条的间隔线。显然,NLevels关键字的值在IDL中只能作为等值线选择算法中的一个“建议”。
因此,大多数IDL程序员都是自己计算等值线数目。例如,能精确规定哪条等值线应该画,并用Levels关键字传给Contour命令,而不是用NLevels关键字,如下所示:
& & IDL&vals=[200, 300, 600,
750, 800, 900, ]
& & IDL&Contour, peak, lon,
lat, XStyle=1, YStyle=1, /Follow, $
&Levels=vals
要选择12个间距相等的等值线间隔,可编写如下代码:
& & IDL&nlevels=12
IDL&step=(Max(peak)-Min(peak))/nlevels
IDL&vals=Indgen(nlevels)*step+Min(peak)
& & IDL&Contour, peak, lon,
lat, XStyle=1, YStyle=1, /Follow, $
&&&Levels=vals
如果喜欢,可以C_Labels关键字精确的指定哪一根等值线应该标注。这个关键字是一个其元素与等值线数目相等的矢量(如果元素个数与等值线数目不匹配,那么元素就不能象其它关键字那样循环使用)。如果某元素的值是1(或更精确,只要是正数),相应的等值线就给予标注;如果某元素的值是0,相应的等值线就不予标注。如果某条等值线没有元素值与之对应时,那么这条等值线就不标注。例如,要标注第一,第三,第六和第七条等值线,可键入:
& & IDL&Contour, peak, lon,
lat, XStyle=1, YStyle=1, /Follow, $
Levels=vals, C_Labels=[1, 0, 1, 0, 0, 1, 1, 0]
要标注所有的等值线,可以使用Replicate命令来将1复制所需要的次数。键入:
& & IDL&Contour, peak, lon,
lat, XStyle=1, YStyle=1, /Follow, $
&&&Levels=vals,
C_Labels=Replicate(1, nlevels)
修改等值线图
  等值线图可用与Plot命令和Surface命令中相同的关键字进行修改。但是仍然还有许多仅适用于Contour命令的关键字。它们中的大部分经常用于修改等值线本身。例如,用坐标轴标题注释等值线图,可键入:
contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&/Follow,
Xtitle=’Longitude’,
Ytitle=’Latitude’,&&$
Charsize=1.5,&&Title=’Study Area
13F89’,&&Nlevels=10
也可以用C_Annotation关键字在等值线上标注释。可以用字符串标记每一条等值线:
contour,&&peak,
Xstyle=1,&&Ystyle=1,&&/Follow,
Xtitle=’Longitude’,
Ytitle=’Latitude’,&&Charsize=1.5,&&Title=’Study
Area 13F89’,$
C_annotation=[‘Low’,’Middle’,’High’],
Levels=[200,&&500,&&800]
输出结果应与图19中的图例相似。
图19: 等值线可以用自己提供的文本标识
改变等值线图的外观
  修改等值线图的外观有许多方法。这里有一些例子。能改变的特性之一是等值线的线型(见表3列出的可选用的线型值)。例如,为了使等值线成为虚线的线型,键入:
& &IDL& Contour, peak,
lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&$
/Follow, C_LineStyle=2
&&&假如需要隔二条等值线有一条虚线,可以用C_LineStyle
关键字指定一个线型索引矢量,假如等值线数比索引号多,那么这些索引号将被循环使用或被重复使用。键入 :
contour,&&peak,&&lon,&&lat,&&XStyle=1,&&Ystyle=1,&&/Follow,&&$
&&&Nlevels=9,&&C_LineStyle=[0,
输出结果应与图20相似.
图20:可以修改等值线图的许多方面。这是隔二条等值线有一条虚线的等值线图。
可以改变等值线的宽度。例如,要使等值线具有双倍的宽度,可键入:
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&$
&&&Nlevels=12,
 C_Thick=2,  /Follow
通过指定一个线宽矢量,可以间隔修改等值线的宽度:
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&$
&&&Nlevels=12,
 C_Thick=[1,&&2],  /Follow
通过修改等值线图,可以很容易地看到等值线图的下坡方向。键入:
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&$
Follow,&&Nlevels=12,&&/Downhill
输出结果应与图21相似。
图21:用Downhill来显示等值线图的下坡方向。
给等值线图赋色
  给等值线图着色的方法有许多种。(颜色将在第83页的“IDL的颜色运用”中详细讨论。现在,只须按如下键入TvLCT命令即可,以后将学到这个命令的意义。实质上,装载了三个颜色矢量,每个矢量的三个分量分别代表颜色的三个组成部分红,绿,蓝。这三种颜色矢量为碳灰,黄,绿色。)假如需要一张以碳灰颜色为背景的黄色等值线图,可键入:
TvLCT,&&[70,&&255],&&[70,&&255],&&[70,&&0],&&1
Contour,&&peak,&&lon,&&lat,&&XStyle=1,
YStyle=1,&&$
&&&NLevels=10,&&Color=2,&&Background=1,&&/Follow
也可以用C_Color关键字给等值线本身单独添上颜色。如果需要将上图的等值线变为绿色 ,键入:
TvLCT,&&0,&&255,&&0,&&3
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&/Follow,&&$
&&&Nlevels=10,&&Color=2,&&Background=1,&&C_Colors=3
关键字C_Color也可以被表达为彩色表索引号的矢量,并以循环的方式绘制等值线。也可以使用Tek_Color命令为等值线创建或者装入颜色,如下:
IDL& Tek_Color
TvLCT,&&[70,&
&255],&&[70,&&255],&&[70,&&0],&&1
IDL&Contour,&&peak,&&lon,&&lat,&&XStyle=1,&&YStyle=1,&&$
Nlevels=10,&&Color=2,&&Background=1,&&$
C_Colors=IndGen(10)+2,&&/Follow
可以很容易地用C_Colors关键字使每间隔二条等值线有一条蓝色的等值线,其余的等值线为绿色。键入:
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&$
&&&NLevels=12,&&Color=2,&&Background=1,&&$
&&&C_Colors=[3,
3, 4],&&/Follow
创建填充的等值线图
  有时用户不只是想观察等值线,也想查看填充后的等值线图。创建一张填充的等值线图,只需使用关键字Fill即可。首先,装入12种颜色于彩色表中作为填充颜色。色彩索引号由关键字C_Colors给出。键入:
IDL& LoadCT, 0
LoadCT,&&4,&&Ncolors=12,&&Bottom=1
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&/Fill,&&$
&&&NLevels=12,&&/Follow,&&C_Colors=Indgen(12)+1
  用这种方法填充颜色还是存在许多问题,尽管从显示看不是很明显。事实上,在等值线图有一个以背景颜色填充的”洞”。假如将背景色与图形颜色交换一下,就可以看得更清楚一些(事实上,PostScript中就是这样做的。这也是致使许多IDL程序人员焦头烂额的原因)。
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&/Fill,&&$
&&&NLevels=12,&&/Follow,&&C_Colors=Indgen(12)+1,&&$
&&&Background=!P.Color,&&Color=!P.Background
“洞”产生的原因是由于IDL用第一种颜色填充了第一和第二条等值线间的空间。用第一种填充颜色去填充第零条(或背景)和第一条等值线之间的空间似乎更合理。但是,要使IDL这样做,不得不给定自己的等值线数目,并用关键字Levels传送给Contour命令。通常可用下述代码实现:
IDL& step = (Max(peak) & Min(peak)) / 12.0
IDL& clevels = IndGen(12)*step + Min (peak)
现在,就得到了正确的等值线填充颜色。
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&/Fill,&&$
&&&Levels=clevels,&&/Follow,&&C_Colors=Indgen(12)+1,&&$
&&&Background=!P.Color,&&Color=!P.Background
&&&通常情况下,在填充等值线图时,经常定义等值线数目不失为一种好的方法。此外,要将填充的等值线图和色彩棒一起显示时,那么,创建自己的等值线数目是确保等值线数目与色彩棒的级数一致的唯一方法。
有时候,需要填充有丢失数据的等值线图或者是等值线超出了图形边界的等值线图,这种情况称为“开放的等值线”。
IDL处理这些开放的等值线时有时比较困难。填充这类等值线图的最好办法是使用关键字Cell_Fill,而不是使用 Fill
关键字。这将导致Contour命令使用单元填充算法。这种算法没有 Fill关键字使用的算法效率高,但在这种情况下可
以获得更好的填充效果。假如需要将填充的等值线图放在地图投影上,使用Cell_Fill关键字也是个好主意。
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&$
&&&Levels=clevels,&&C_Colors=Indgen(12)+1,&&/Cell_Fill
  单元填充算法有时会破坏等值线图的坐标轴。可以通过不带数据的等值线图的重新绘制来修复。键入:
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&$
&&&Levels=clevels,&&/NoData,&&/NoErase,&&/Follow
  有时,可能想在已填充好颜色的等值线图上看到等值线。在IDL中用Overplot关键字可以轻而易举地实现。键入:
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&$
&&&Levels=clevels,&&/Fill,&&C_Colors=IndGen(12)+1
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&/Follow,&&$
&&&Levels=clevels,&&/overplot
输出结果应与图22相似
图22:在已填充的等值线图上覆盖等值线
  注意,不要混淆Overplot和NoErase关键字。它们是相似的,但确切地说是不一样的。在等值线图上,Overplot关键字仅仅绘出等值线,而不绘出等值线图的坐标轴。
NoErase关键字则是绘出完整的等值线图,而不删除在屏幕上已显示的内容。
在显示窗口定位图形输出
  IDL内建几种在显示窗口中定位线画图、曲面图、等值线图和其它图形的方法(比如地图投影)。为了理解IDL怎样定位图形,了解一些定义很重要。图形位置是指在显示窗口上被图形坐标轴框起来的部分中的位置。图形位置不包括坐标轴标识、坐标轴标题或其它注释(见下面的图23)。图形区域是显示窗口的一部分,包括图形位置,也包括环绕图形位置的空间,用来注明坐标轴标识,坐标轴标题和图标题等。图形边界定义为在显示窗口内不包括图形位置的区域。
  图形位置可以用!P.Position系统变量设置,或者用Position关键字对Plot, Surface,
Contour或其它IDL图形命令进行设置。整个图形区域可用!P.Region系统变量设置,或者通过!X,
!Y和!Z系统变量的Region字段来设置单个坐标轴的区域。图形边界可以用[XYZ]Margin关键字来对Plot, Surface, Contour或IDL的其它图形命令进行设置,或者通过!X, !Y和!Z系统变量的Margin字段来设置。
  在缺省值情况下,IDL是在将图形输出到显示窗口的时候设置图形边界的。但是,正如所看到的,这并不是最好的选择。有时,使用图形定位来定位图形显示会更好,尤其是当您在一个显示窗口中显示多个命令的输出结果时。
图形位置是被坐标轴包围起来的区域。图形区域与图形位置类似,但它还包括图形标题和其它注释的区域。图形边缘正好与图形位置相反。图形边缘由字符的单位确定,而图形位置和图形区域是由归一化的坐标单位确定。
设置图形边缘
  图形边缘可以用图形命令中的[XYZ]Margin关键字设置,或者通过!X,!Y和
!Z系统变量的Margin字段来设置。关于图形边缘的特殊地方在于它的单位根据字符尺寸来确定。X方向的边缘是用两元素矢量来设置的,这两个元素分别规定左右的偏移量。Y方向的边缘用同样的方法确定底部和顶部的偏移量。缺省边缘值是X轴方向为10和3,Y轴方向为4和2。为了查看当前字符尺寸的设备坐标值或像素坐标值,可键入:
Print,&&!D.X_Ch_Size,&&!D.Y_Ch_Size
  例如,在苹果机(Macintosh)中,缺省的字符尺寸在X方向上为6个像素,在Y方向上为9个像素。因此,一张等值线图的边缘就被确定为图形的左边为60个像素(6*10),右边为18个像素(6*3)。如果CharacterSize关键字在
Contour命令中设置为2,那么将会出现图形的左边边缘为120个像素,而图形的右边边缘为36个像素。
例如,为了将图形四周边缘都改变为3个缺省的字符宽度,可键入:
Plot,&&time,&&curve,&&Xmargin=[3,
3],&&Ymargin=[3, 3]
注意,如果同时改变字符尺寸,图形将出现非常大的差异。因为图形边界是由字符的尺寸确定的。键入:
IDL& !X. Margin = [3, 3]
IDL& !Y. Margin = [3, 3]
Contour,&&peak,&&CharacterSize=2.5
Contour,&&peak,&&CharacterSize=1.5
&&&假如用其它的字符尺寸来做一些同样的操作,会发现,字符尺寸越大,字符将变得很大并且图形部分将变得很小,这并不是所希望看到的。当向下继续学习时,请确保将图形边界已恢复为缺省值。键入:
IDL& !X.Margin = [10, 3]
IDL& !Y.Margin = [4, 2]
  注意,IDL语言中有一些系统变量不象许多其它系统变量那样通过将其设置为零即可恢复其缺省值那样,系统边缘变量则必须直接将其设置为缺省值。假如没有键入以上的两条命令,请现在就键入将其恢复。
设置图形位置
  设置图形位置需要设置一个四个元素的矢量,该矢量依次给定图形在显示窗口中的左下角和右上角坐标[X0,Y0,X1,Y1]。这些坐标值通常为归一化的值,其范围在0至1之间(如:0常常代表显示窗口的左下角,1常常代表显示窗口的右上角。)
  设想如果需要将图形输出结果在显示窗口的上半部分显示,可以按如下设置!P.Position系统变量并显示图形:
IDL& !P.Position = [0.1, 0.5, 0.9, 0.9]
IDL& Plot, time, curve
所有后面的图形输出定位方法都是类似的。将!P.Position系统变量复位,以便后面的图形输出能正常地显示在窗口中。键入:
IDL& !p.position = 0
  假如仅想给一张图形窗口定位,可以用图形命令的Position关键字规定一个图形位置。如果要在整个显示窗口的左半部分显示等值线图,可以键入:
Contour,&&peak,&&Position=[0.1,
0.1, 0.5, 0.9]
注意,Position关键字可以用来在同一显示窗口输入多幅图形。只要确保在输入第二幅图形和所有的后续图形时,使用NoErase关键字。这可防止在显示图形时删除前面已显示的图形。对于所有的图形输出命令来说,这是一项缺省特性,但是对TV和TVScl命令则是例外。
在一张等值线图上加入一条线画图,可键入:
Plot,&&time,&&curve,&&Position=[0.1,
0.55, 0.95, 0.95]
Contour,&&peak,&&Position=[0.1,
0.1, 0.95, 0.45],&&/NoErase
设置图形区域
  图形区域与图形位置一样,都是由归一化坐标值来确定的。同样可以通过设置!P.Region系统变量来指定。由于不存在和其它图形命令等效的关键字,因此设置图形区域没有设置图形位置方便。如果希望后续图形能正常地使用整个显示窗口,应确保已经将系统变量复位了。例如,在显示窗口上方三分之二的部分区域中显示一幅图形,键入:
IDL& !P.Region = [0.1, 0.33, 0.9, 0.9]
Plot,&&time,&&curve
将!P.Region系统变量复位,以便后续图形能正常地在窗口内显示。键入:
IDL& !P.Region = 0
创建多个图形
  正如所见,通过使用图形位置和图形区域系统变量以及上面所讨论的关键字可以在一个显示窗口中显示并定位多个图形(只要绘制第二个和后续的图形时使用了NoErase关键字)。另外一个系统变量!P.Multi将会使在显示窗口内创建多个图形更加容易。!P.Multi由以下五个元素进行矢量定义。
!P.Multi[0]& &
!P.Multi的第一个元素包括剩下的要在显示窗口或者PostScript页上绘制的图形数目。这有点不直观,下面可以看到它是如何使用的。通常设置为0,意思是,没有剩下要在显示窗口输出的图形。接下来的图形命令将删除显示的图形,并且开始绘制新的多个图形中的第一个。
!P.Multi[1]&
&&&此元素规定了该页上图形的列数
!P.Multi[2]&
&&&此元素规定了该页上图形的行数
!P.Multi[3]&
&&&此元素规定了在Z方向上叠加的图形数目(仅适用已经建立了三维坐标系的情况下)
!P.Multi[4]&
&&&此元素规定了是先按行显示图形(!P.Multi[4]=0),还是先按列显示图形(!P.Multi[4]=1)。
  假如想将!P.Multi参数设置为按两行两列在显示窗口内显示四幅图形,并且,先按列显示图形,键入:
IDL& !P.Multi = [0, 2, 2, 0, 1]
  显示图形时,如果要求每个图形占据窗口的四分之一位置,键入:
IDL& window, Xsize=500, Ysize=500
Plot,&&time,&&curve,&&LineStyle=0
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&Nlevels=10
Surface,&&peak,&&lon,&&lat
shade_Surf,&&peak,&&lon,&&lat
输出结果应与图24相似
图24: 在单个显示窗口内可以绘制多幅图形
给单一窗口的多幅图形留下标题空间
  当IDL计算图形位置时,是用整个显示窗口来决定每幅图形的大小。但是,有时想在显示窗口上有额外的空间来放图形标题或者其它类型的注释。可以通过使用!X、!Y和!Z!系统变量的“外边缘”字段为多幅图形留出空间。外边缘字段仅仅在
P.Multi系统变量被使用时有效。它们与正常的图形边缘一样,也是按字符单位来计算的。
  如果想为刚刚创建好的四个图形的总图加上一个标题,应为标题留出空间。键入:
IDL& !P.Multi = [0, 2, 2, 0, 1]
IDL& !Y.Omargin = [2, 4]
Plot,&&time,&&curve,&&LineStyle=0
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,
Ystyle=1,&&Nlevels=10
Surface,&&peak,&&lon,&&lat
Shade_Surf,&&peak,&&lon,&&lat
IDL& XYOuts,&&0.5,
0.9,&&/Normal,&&‘Four
Graphics Plots’,&&$
&&&Alignment=0.5,&&Charsize=2.5
输出结果应于图25相似。
图25: 使用关键字!Y.OMargin在多幅图形的上方留出4个字符高度的空间来放标题
使用!P.Multi变量创建不对称的排列
  使用!P.Multi变量绘图可以创建不对称的图形排列。例如,需要曲面图与阴影图一上一下地排列显示在显示窗口的左边,而显示窗口的右边是一张用同一数据生成的等值线图。可键入:
IDL& !P.Multi = [0, 2, 2, 0, 1]
IDL& !Y.OMargin=[0,0]
Surface,&&peak,&&lon,&&lat
Shade_Surf,&&peak,&&lon,&&lat
IDL& !P.Multi = [1, 2, 1, 0, 0]
Contour,&&peak,&&lon,&&lat,&&Xstyle=1,&&Ystyle=1,&&Nlevels=10
  第一个!P.Multi命令设置了一个二列二行的排列形式,第一、第二张图已制好。第二个
!P.Multi命令设置了一个二列一行的排列形式。但要注意
!P.Multi[0]被设置为1。结果是等值线图进入了显示窗口的第二个位置而不是第一个。结果由图26可以看出。
图26: 可以使用!P.Multi在显示窗口定位图形的不对称排列
  注意:与PLOT和CONTOUR命令不同,TV命令与!P.Multi一起使用时无效。但是,在此书中可以用TVImage程序代替TV命令,该程序在已经下载的程序中。如果在使用TVImage中设置了MULTI关键字,!P.Multi系统变量就有效。试试这些命令:
IDL& image = LoadData(7)
IDL& !P.Multi=[0, 2, 2]
IDL& FOR j=0, 3 DO
TVImage,&&image,&&/Multi
  确保已经将!P.Multi复位,以便在一页上显示单个图形。象许多系统变量一样,
!P.Multi可以通过设置!P.Multi=0重新设置为它的缺省值。
IDL& !P.Multi = 0
给图形显示添加文本
图形注释和其它文本可以通过许多方式添加到图形窗口中。最常用的方法是通过图形显示命令的关键字。被添加的文本可以三种字体“风格”中的任意一种形式出现:矢量字体(有时也称为软字体或
Hershey 字体)、TrueType字体、硬字体。字体类型可以根据表6通过设置!P.Font系统变量或者在图形输出命令中设置
Font关键字来加以选择。
!P.Font字体选择
-1矢量字体(也叫软字体或Hershey字体)
1TureType轮廓字体
字体“风格”可以通过设置!P.Font系统变量或者Font关键字为适当值来加以选择。矢量字体是直接图形命令的缺省字体,它们有不依赖于平台的优点
  在缺省值情况下,直接图形程序使用的是矢量或软字体的形式。矢量字体由矢量坐标描述。其结果是,它们是独立于平台并且极易在三维空间旋转。但是,许多人发现,对于高质量的硬拷贝输出来说,矢量字体太“瘦”了。为此,需要更丰满的字体(比如:TrueType字体或者PostScript打印机硬件字体)。通过设置!P.Font系统参数为-1或者在图形输出命令上设置Font关键字为-1,就选择矢量字体了。如:
Plot,&&time,&&curve,&&Font=-1,&&Xtitle=’Time’,&&$
&&&Ytitle=’Signal’,&&Title=’Experiment
  TrueType字体也称为轮廓字体,这种字体由一系列的外形轮廓描述的,这些轮廓通过创建一系列的多边形来填充。IDL有四种TrueType字体家族系列:Times,
Helvetica, Courier,
和Symbol。TrueType字体渲染需要花更长的时间,因为这种字体首先必须刻绘出来,然后创建相应的填充多边形,最后填充。并且许多人发现这种字体在低分辨率显示器上用小磅值时显示效果不好。但是它们有可以旋转的优点,并且硬拷贝输出上较美观。TrueType字体是IDL对象图形系统的一种缺省字体。
  用缺省的Helvetica TrueType字体的外形来绘制图形,须设置Font关键字为1。如:
Plot,&&time,&&curve,&&Font=1,&&Xtitle=’Time’,&&$
&&&Ytitle=’Signal’,
Title=’Experiment 35F3a’
  TrueType字体可以用Device命令通过Set_Font和TT_Font关键字来选择。如下:
Device,&&Set_Font=’Courier’,&&/TT_Font
Plot,&&time,&&curve,&&Font=1,&&Xtitle=’Time’,
&&&Ytitle=’Signal’,&&Title=’Experiment
  在IDL中,为了掌握更多的TrueType字体,可以使用联机帮助系统。
IDL& ?&&fonts
  硬字体通过设置!P.Font系统变量或
Font关键字为0来加以选择。通常情况下,硬字体并不用于图形显示中,而是在当内容被输出到硬拷贝输出设备时使用,例如
PostScript打印机。直到最近的IDL版本,硬字体都不能很好地在三维空间内旋转。因此,在使用类似于Surface等三维命令时,一般都不使用硬字体。
Plot,&&time,&&curve,&&Font=0,&&Xtitle=’Time’,&&$
&&&Xtitle=’Signal’,&&Title=’Experiment
列出可用字体的名称
  可以用以下Device命令列出可用的硬字体名。如:
Device,&&Font=’*’,&&Get_FontNames=fontnames
j=0,&&N_Elements(fontnames)-1 DO
Print,&&fontnames[j]
  只要使用TT_Font关键字,TureType字体名称可用类似的方法列出。TT_Font关键字用来选择系统上可用的TureType字体。(可以把自己的TureType字体加到IDL提供的四种系列类型内。如何实现可参考IDL的联机帮助系统。)
Device,&&FONT=’*’,&&Get_FontNames=fontnames,&&/TT_Font
j=0,&&N_Elements(fontnames)-1 DO
Print,&&fontnames[j]
  可用的矢量字体名称在表7给出。
用XYOutS命令添加文本
  在IDL 中一个非常重要的命令是XYOutS命令(在XY
给定的位置,输出一个字符串)。这个命令用来在窗口的特定位置放入一个文本字符串。(XYOutS
的第一个位置参数是X的位置,第二个位置参数是Y的位置)。例如,给线画图加上一个较大的标题,键入如下命令:
Plot,&&time,&&curve,&&Position=[0.15,
0.15, 0.95, 0.85]
XYOutS,&&0.5,&&32,&&‘Results:
Expe riment
35F3a’,&&Size=2.0
  注意,是用数据坐标来给定X和Y的位置,同时Y坐标在图形边界之外。在缺省的情况下,XYOutS过程使用数据坐标系统。但是,如果选用适当的关键字,设备坐标系统和归一化的坐标系统也可使用。
  (数据坐标系统由数据自身的大小所描述。设备坐标有时称为像素坐标,设备坐标系统经常和图像一起使用。归一化的坐标系统在每个方向从0到1。当需要用独立于设备输出图形时,经常使用归一化坐标。)
例如,可以象如下使用归一化坐标把标题加在线画图上。当编写IDL程序时,用归一化坐标确定标题和其它注释等是一种很好的主意。这不仅更容易于在显示窗口定位图形,也便于在PostScript和其它硬拷贝输出文件中定位图形。
Plot,&&time,&&curve,&&Position=[0.15,
0.15, 0.95, 0.85]
XYOutS,&&0.2,&&0.92,&&‘Results:
Experiment 35F3a’,&&$
&&&Size=2.0,&&/Normal
数值描述数值描述
!3Simplex Roman!12Simplex Script
!4Simplex Greek!13Complex Script
!5Duplex Roman!14Gothic Italian
!6Complex Roman!15Gothic German
!7Complex Greek!16Cyrillic
!8Complex Italian!17Triplex Roman
!9Math Font!18Triplex Italian
!10Special Characters!20Miscellaneous
!11Gothic English!X回到刚进入时的字体
表7:Hershey字体和其相应的在IDL中用于选择各字体的索引号
用XYOut加注矢量字体
  XYOutS命令可用于矢量字体、TureType字体或硬字体,只需按上述所述,简单地设置Font关键字值即可。这里的讨论是关于矢量字体的,因为在直接图形命令中,此字体系统使用最频繁。表7中给出可获得的矢量字体和其相应的索引号,可以通过索引号来选择的特定字体。
  矢量字体或Hershey字体的主要优点是它们的平台独立性,并且可在三维空间中缩放和旋转。例如,可以用Triplex
Roman字体输出上图的标题,键入:
Plot,&&time,&&curve,&&Position=[0.15,
0.15, 0.95, 0.85]
IDL& XYOutS,&&0.2,
0.92,&&‘!17Results: Experiment
35F3a!X’,&&$
&&&Size=2.0,&&/Normal
  Triplex Roman字体由!17转换序列来选定。标题串末端的!X将使字体转变为Simplex
Roman字体,而Simplex Roman字体是在变为Triplex
Roman字体前所使用的字体。这个转变步骤是非常重要的。否则,缺省设置将变为Triplex
Roman,并且所有接下来的串标记都将使用Triplex Roman字体。试试使用
Greek字符集作为X轴的标题,并且按下面输出下图的标题。键入:
Plot,&&time,&&curve,&&Xtitle=’!17w’,&&$
&&&Position=[0.15,
0.15, 0.95, 0.85]
IDL& XYOutS,
0.2,&&0.92,&&‘Experiment
35F3X’,&&size=2.0,&&/Normal
可以在图27中看到结果。您可以注意到,即使没有规定该图的标题字符集,标题也是用Greek字符集输出的。恢复为缺省项Simplex
Roman的唯一办法是用显式地使用 Simplex Roman字体输出另一个字符串,例如:
IDL& XYOutS,&&0.5,
0.5,&&‘!3Junk’,&&/Normal,&&CharSize=-1
注意,在上面的代码中CharSize关键字的使用。当这个关键字值为-1时,字符串被隐藏,不在窗口显示。
图27:当选择一种Hershey字体要注意,否则可能会显示出一个看上去象希腊字母的标题
  可以用XYOutS命令的Alignment关键字通过相对位置来定位文本。当Alignment的值为0时,字符串居左排列(这是缺省值);当Alignment的值为1时,字符串居右排列;当Alignment的值为0.5时,将根据X和Y值所定义的位置居中排列。例如:
Window,&&Xsize=300,&&Ysize=250
XYOutS,&&150,&&55,&&‘Research’,&&Alignment=0.0,&&$
&&&/Device,&&CharSIZE=2.0
XYOutS,&&150,&&110,&&‘Research’,&&Alignment=.5,&&$
&&&/Device,&&CharSIZE=2.0
IDL& XYOutS, 150,
170,&&‘Research’,&&Alignment=1.0,&&$
&&&/Device,&&CharSize=2.0
Plots,&&[0.5,0.5],&&[1.0,0.0],&&/Normal
  用XYOutS书写的文本有时可以通过用背景色书写同样的文本来删除。Color关键字与!P.Background系统变量一起使用可以达到这个目的。需要指出的是,这仅仅限于窗口中除了文本外没有其它内容的情况下奏效。通常还有别的更有效的方法来删除注释。(可参见118页的“从显示窗口删除注释”的例子)。为了理解如何用背景颜色删除注释,键入:
window,&&Xsize=300,&&Ysize=250
XYOutS,&&150,&&110,&&‘Research’,&&Alignment=0.50,&&$
&&&/Device,&&CharSize=2.0
IDL& XYOutS, 150,
110,&&‘Research’
Alignment=0.50,&&$
&&&/Device,&
&CharSize=2.0,&&Color=!P.Background
改变文本的方向
  用XYOutS命令输出的文本可以通过Orientation关键字相对于水平方向上的角度来定向。Orientation关键字可确定文本基线从水平基线开始旋转的度数。键入:
IDL& Window,Xsize=300, Ysize=250
IDL& XYOutS, 150, 110, ‘Research’, Alignment=0.5, $
&&&/Device,
CharSize=2.0, Orientation=45
IDL& XYOutS, 150,180, ‘Research’, Alignment=0.50, $
&&&/Device,
CharSize=2.0, Orientation=-45
给图形显示添加线和符号
  给图形添加注释的另一个有效程序是PlotS命令,它可以用来在图形显示上添加符号或线条。PlotS命令可在二维或三维空间中使用。
  用PlotS程序画线,只需简单地提供含有X和Y坐标的矢量即可,矢量中的X、Y值是需要连接的点的X、Y坐标值。例如,从点(0,15)到点(6,15)在线画图上画一条基线,键入:
IDL& Window, XSize=500, YSize=400
IDL& Plot, time, curve
IDL& PlotS, [0,6], [15,15], LineStyle=2
输出结果应与图28相似。
  PlotS程序可以用来在任何位置标上符号。下面是在曲线上每五个点处标注一个菱形符号的实例。
IDL& TvLCT, [70, 255, 0], [70, 255, 250], [70, 0, 0], 1
IDL& Plot, time, curve, Background=1, Color=2
IDL& index = IndGen(20)*5
IDL& Plots, time[index], curve[index], Psym=4, $
&&&Color=3,
图28:用PlotS 命令画一条虚线跨过图形的中部
  PlotS命令也可以用来在图上重要信息的周围画出一个方框。通过PlotS命令与其它图形命令组合,如XYOutS命令,可以有效地注释图形显示。例:
IDL& TvLCT, [70, 255,0], [70,255,255], [70, 0, 0],1
IDL& Plot, time, curve, Background=1, Color=2
IDL& box_x_coords = [0.4, 0.4, 0.6, 0.6, 0.4]
IDL& box_x_coords = [0.4, 0.6, 0.6, 0.4,0.4]
IDL& PlotS, box_x_coords, box_y_coords, Color=3, /Normal
IDL& XYOutS, 0.5, 0.3, ‘Critical Zone’, Color=3, Size=2, $
&&&Alignment =
0.5, /Normal
  注意,可以容易地使用XYOutS和PlotS命令为图形显示创建图例。
图形显示添加色彩
  另一种有效的标注图形显示的方法是使用颜色。Polyfill命令是一个低级的图形显示命令,它可用特殊的颜色或图案填充任意形状的多边形(无论是在二维或还是在三维环境中)。例如,可以使用Polyfill命令用红颜色填充上面线画图中方框:
IDL& TvLCT, 255, 0,0 ,4
IDL& Erase, Color=1
IDL& Polyfill, box_x_coords, box_y_coords, Color=4,
IDL& Plot, time, curve, Background=1, Color=2, /NoErase
IDL& PlotS, Box_x_coords, box_y_coords, Color=3, /Normal
IDL& XYOutS, 0.5, 0.3, ‘Critical Zone’, Color=3, Size=2, $
&&&Alignment =
0.5, / Normal
  颜色有时代表一个数据集的另外一维的特性。例如,可以用二维圆形(或多边形)显示XY数据,而设置每个多边形的颜色就可表现出数据的某些附加特性,比如温度和人口密度等。查看以下是如何实现的。
  IDL没有构建圆的函数,但是很容易编写这样一个功能函数。打开文本编辑器或在IDL环境中键入代码来创建IDL的Circle功能。
FUNCTION CIRCLE, xcenter, ycenter, radius
Points = (2 * !PI / 99.0) * FindGen(100)
x = xcenter + radius * Cos(points)
y = ycenter + radius * Sin(points)
RETURN, Transpose([x],[y])
  组成圆周的X和Y值将以2*100数组形式返回。可以将该数组输入到Polyfill命令中。以Circle.pro保存该程序,并通过键入如下命令进行编译:
IDL& .Compile circle
  然后,创建随机分布的X和Y数据。(将Seed设置回初始状态,这样输出结果将与图29看上去相似)。键入:
IDL& seed = -3L
IDL& x = RandomU(seed,30)
IDL& y = RandomU(seed,30)
  将Z值设为这些X值和Y值的函数。键入:
IDL& z = (3 * ( (x-0.5)^2) + 5*((y-0.25)^2)) * 1000
  打开窗口绘制XY位置,就可以看到这些数据是怎样以随机形式分布的。键入:
IDL& Window, Xsize=400, Ysize=350
IDL& Plot, x, y, Psym=4, Position=[0.15, 0.15, 0.75,
&&&Xtitle=’X
Locations’, Ytitle=’Y Locations’
  将以不同颜色的圆显示与XY位置相关的Z数据。需要加入一张颜色表,并且使Z数据缩放至可获得的颜色数的范围内。键入:
IDL& LoadCT, 2
IDL& zcolors = Bytscl(z, Top=!D.Table_Size-1)
在这个例子里使用的Circle程序有许多弱点。主要缺点是它并非总是生成圆。假如用数据坐标系统来给定圆的坐标,圆形可能将以椭圆的形式显示,主要取决于图形长宽比例以及其它影响因素。(要获得非常棒的圆,可以从NASA
Astrophysics的IDL例库中下载TVCircle程序,可以用浏览器通过http://idlastro.gsfc.nasa.gov/homepage.html来找到该例库)。为避免Circle程序中的这种不足,可用Convert_Coord命令将数据坐标转换为设备坐标。键入:
IDL& coords = Convert_Coord (X, Y, /Data, /To_Device)
IDL& x = coords(0,*)
IDL& y = coords(1,*)
  最后需要使用Polyfill命令画出表示Z数据的彩色圆。键入:
j=0,&&29&&Do&&Polyfill,&&Circle(x(j),
y(j), 10),&&$
&&&/Fill,&&Color=zcolors(j),&&/Device
  附带地说一下,最好有一个色标能够告知Z值和各种颜色的某些关系。可以用本书的Colorbar程序增加一个色标,键入:
IDL& Colorbar,&&Position =
[0.85, 0.15, 0.90,
&&&Range=[Min(z),
Max(z)],&&/Vertical,&&$
&&&Format=’(I5)’,&&/Right,&&Title=’Z
输出结果应与图29相似
图29:在二维图中圆的颜色代表了第三维信息
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 有的菱形是正方形 的文章

 

随机推荐