例如,可以象如下使用归一化坐标把标题加在线画图上。当编写IDL程序时,用归一化坐标确定标题和其它注释等是一种很好的主意。这不仅更容易于在显示窗口定为图形,也便于在PostScript和其它硬拷贝输出文件中定位图形。
IDL> Plot, time, curve, Position=[0.15, 0.15, 0.95, 0.85] IDL> XYOutS, 0.2, 0.92, ‘Results: Experiment 35F3a’, $ Size=2.0, /Normal 数值 !3 !4 !5 !6 !7 !8 !9 !10 !11 描述 Simplex Roman Simplex Greek Duplex Roman Complex Roman Complex Greek Complex Italian Math Font Special Characters Gothic English 数值 !12 !13 !14 !15 !16 !17 !18 !20 !X 描述 Simplex Script Complex Script Gothic Italian Gothic German Cyrillic Triplex Roman Triplex Italian Miscellaneous 回到刚进入时的字体 表7:Hershey字体和其相应的在IDL中用于选择各字体的索引号
用矢量字体使用XYOut
XYOutS命令可用于矢量字体,TureType字体或硬字体,只需按上述的那样,简单的设置Font关键字值即可。这儿的讨论是关于矢量字体的,因为在直接图形命令中,此字体系统使用最频繁。表7中给出可获得的矢量字体和其相应的索引号,可以通过索引号来选择的特定字体。
矢量字体或Hershey字体的主要优点是它们的平台独立性,并且可在三维空间中缩放和旋转。例如,可以用Triplex Roman字体输出上图的标题,键入: IDL> 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轴的标题,并且按下面输出下图的标题。键入:
IDL> 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值所定义的位置居中排列。例如: IDL> Window, Xsize=300, Ysize=250
IDL> XYOutS, 150, 55, ‘Research’, Alignment=0.0, $ /Device, CharSIZE=2.0
IDL> XYOutS, 150, 110, ‘Research’, Alignment=.5, $ /Device, CharSIZE=2.0
IDL> XYOutS, 150, 170, ‘Research’, Alignment=1.0, $ /Device, CharSize=2.0
IDL> Plots, [0.5,0.5], [1.0,0.0], /Normal
删除文本
用XYOutS书写的文本有时可以通过用背景颜色书写同样的文本来删除。Color关键字与!P.Background系统变量一起使用可以达到这个目的。需要指出的是,这仅仅在文本只是写在背景上没有任何东西的情况下奏效。通常还有别的更有效的方法来删除注释。(可参见118页的“从显示窗口删除注释”的例子)。为了明白如何用背景颜色删除注释,键入: IDL> window, Xsize=300, Ysize=250
IDL> 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, SymSize=2
图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, /Normal 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的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]) END
组成圆周的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, 0.95],$ Xtitle=’X Locations’, Ytitle=’Y Locations’
将以不同颜色的圆显示与XY位置相关的Z数据。需要加入一张颜色表,并且使Z数据缩放至可获得的颜色数的范围内。键入: IDL> LoadCT, 2
IDL> zcolors = Bytscl(z, Top=!D.Table_Size-1)
在这个例子里使用的Circle程序有许多弱点。主要缺点是它并非总是生成圆。假如用
数据坐标系统来给定圆的坐标,圆形可能将以椭圆的形式显示,主要取决于图形长宽比例以及其它影响因素。(要获得非常棒的圆,可以从NASA Goddard 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数据的彩色圆。键入: IDL> For 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, 0.95], $ Range=[Min(z), Max(z)], /Vertical, $
Format=’(I5)’, /Right, Title=’Z Values’ 输出结果应与图29相似
图29:在二维图中圆的颜色代表了第三维信息