当前位置:文档之家› IDL教程

IDL教程

IDL教程
IDL教程

实验一IDL的介绍和基础知识

目的:了解IDL的构成和基本框架体系;熟练掌握IDL的变量;掌握IDL的命令书写及数据的输入输出

原理:标量,矢量,数组,结构体;命令书写规则;数据输入输出方法

软件:IDL

内容:

一、介绍IDL

IDL(Interactive Data Language)交互式数据语言是进行数据分析、可视化表现和应用开发的理想软件工具。作为面向矩阵、语法简单的第四代可视化语言。IDL的特性包括:高级图像处理能力、交互式二维和三维图形技术、面向对象的编程方式、OpenGL图形加速、量化可视化表现、集成数学与统计学算法、灵活的数据输入输出方式、跨平台图形用户界面工具包、连接ODBC兼容数据库及多种程序连接工具等。

IDL是完全面向矩阵的,相比常用语言它具有快速分析超大规模数据的能力,而相比于同样面向矩阵的其他软件,它又能够更容易实现图形对象的交互操作和图形、图像的高级处理。

IDL的用户群分布很广。它不但可以为科学研究人员提供交互式浏览和分析数据的环境,为程序员提供快速源程序开发及跨平台发布的高级编程语言,还可以为三维动画制作人员和三维地理信息系统应用人员提供良好的软件应用平台。

在国外IDL已经被列为大学的标准课程,其功能和应用效果完全可以替代如Matlab等其他同类科学计算应用软件。在国内IDL要比国外稍微滞后,还处在推广和应用的初期。许多科研单位和一些大学在与国外单位交流中,特别是一些留学归国人员,是IDL在国内应用的先行者和忠实用户。随着IDL应用和市场的广泛进入和从科研院所的高端应用到更广泛地民用化的接受过程,越来越多的人将了解和接受应用IDL。

IDL给用户提供3种不同的工作方式:命令交互方式、程序执行方式和菜单操作方式。可以根据用户需要配合使用。

二、IDL命令书写规则:

命令动词[,参数1,…,参数n][,关键字1,…,关键字n]

(1)每条命令必须以命令动词开始,动词后面的选择项可以必选或者可选。

(2)参数在命令动词的右边,一般有确定的顺序和确定的类型,一般是必选项。

(3)关键字在命令动词的右边,一般有确定的类型,但是顺序是任意的,而且一般为可

选项。

(4)用逗号分隔每条命令中的各个选项。

(5)一条命令太长,一条写不下,用$在行尾进行分行,并在下一行继续写。

不分大小写(但是要有统一的习惯)

注释符“;”

续行符“$”

分隔符“,”

IDL> print,'hello',format='(5x,A5)'

三、IDL的基础知识

1、变量

(1)命名规则

变量名称的最大长度不超过255个字符,变量的首位只能是字母和下划线,中后部只能是字母、数字、下划线“_”和连接符“$”。如下正确:

reade6_$file only_8_bit ComputerType variables _day_of_year

如下错误:

https://www.doczj.com/doc/3c15369303.html,st third%file 4th_list $temp

(2)创建变量

变量有两个重要属性:数据类型和组织结构。数据类型指出属于数据类型中的哪一种。在IDL中有14种基本数据类型。在图表1中可以看到每一种数据类型,每个类型创建的变量的字节大小、变量创建方式、数据类型之间强制转换的IDL函数名称。除了数据类型外,一个变量有一个组织结构。有效的组织结构有标量(例如单个数值)、矢量(真正的一维数

(3)IDL语言变量的特点及标量赋值

创建IDL变量不需要事先声明,是通过赋值形式进行定义的语言变量定义。并且变量随时可以进行数据类型和维数的动态改变。

IDL最强大的功能之一,就是大多数过程或函数都能在任何数据类型或组织结构上生效。这是因为IDL在运行时能改变变量的数据类型和组织结构(像世界上其他强大的事物一样,这种动态改变变量的属性的能力也有潜在的巨大危险!必须小心,确信知道正在使用哪种数据)。在IDL中,本质上讲变量是毫无意义的(像在Fortran或者C程序中),因为这种变量的数据类型很容易改变。例如:

IDL>num = 3

IDL>num = num*5.2

IDL>num = float(3)

变量num被初始化为一个整数,由于数学运算的结果和重新赋值,它被动态地改变成浮点数值。这是因为IDL在数学计算当中为了保证最高的精度,将低精度的数据类型提升为高精度的数据类型。当num被再赋值(在等号的左边),它被提升为一个浮点数去保持等号右边计算的精度。思考下面这个例子:

IDL>result=4*x‘保持高精度

在这种情形下,不可能知道变量会产生哪种数据类型和组织结构,因为对x变量一无所知。事实上,结果主要取决于变量x的数据类型和数据结构。如果x是10个元素的浮点矢量,结果将会是10个元素的浮点矢量。如果它是100 × 200的长整型数组,结果也将是100 ×200的长整型数组。注意,如果x有一个字节的数据类型,那么结果将是一个整型数据类型(在这种情形下,组织结构并没有多大影响)。这是由于和整数相乘的结果。

记住,等号右边的表达式总是在将数据类型和组织结构赋予等号左边的变量前计算的。IDL总是将变量提升到能保持表达式的计算精度的数据类型。

注意整型变量

关于整型变量有两种常见的错误。第一种涉及到整数数学操作。思考一下这个示例:

IDL>result=12/5

也许期望的是一个值为2.4浮点变量,但是结果却是一个值为2的整数。这是因为方程式右边的两个数字为整数。这是一个整数除法的例子。当然,找到这个问题的原因并不难,但有时由整型数据导致的问题会更微小,以致于难以发现。

例如: 假如想知道IDL图形窗口的比率。窗口的大小(像素点或整数值)被储存在两个系统变量中。会写出如下的IDL代码:

IDL>aspect=!D.X_Size / !D.Y_Size‘系统变量

它可能需要花掉很长的时间来找出为什么比率为零。正确的方法是写出一些代码以强制将一个整数值变成一个浮点,如下:

IDL>aspect=Float(!D.X_Size) / !D.Y_Size

现在的比率变量就是一个所期望的浮点数了

(4)IDL数组

IDL是一个擅长于处理矢量或数组数据的软件,所以有大量的IDL命令用于创建不同数据类型的矢量和数组。特别是,有许多用于创建各种数据类型数组的函数,这类函数创建的数组每个元素的初始值为零。还有许多用于创建各种数据类型数组的函数,这类函数创建的数组每个元素的初始值为其在数组中的索引位置。在表2中将看到这些函数的列表。

表2:IDL函数可以创建矢量和多维数组

例如,创建100×100初始值为零的字节型数组,输入:

IDL>array=BytArr(100,100)

创建一个有100个元素的浮点型矢量,初始数值为从0到99,输入:

IDL>vector=FIndGen(100)

IDL>vector=FIndGen(10,10)

IDL语言数组的维数为:0~8维,数组的引用符号既可以用[],也可以用()但推荐习惯使用[]因为函数的引用采用(),故数组调用采用[]可以与此相区别,数组定义时不能指定下标的区间,只能从0开始。

IDL>print,vector[0]

IDL>print,vector[2]

IDL> print,vector[0:10] 返回前0-10共11个元素

●多维数组:

IDL语言数组的维数为0~8维,当维数大于2的时候就是多维数组了。值得注意的是:数组下标的顺序先是列标,后是行标,这正好与已习惯的线性代数中的矩阵或行列式相反,在IDL矩阵变换函数中会有更详细的介绍。在对多维数组操作时,多维数组的数据空间顺序是否了解清楚,是数据读写准确的重要环节。

IDL>vector=FIndGen(10,20)

●数组赋值基本包括三种模式

IDL对数组赋值是比较灵活的,基本包括三种模式:

1、定义数组之后,对元素进行赋值,如:

IDL>A=IndGen (3,3)

IDL>A[1,2]=0

2、通过数组索引和矩阵(指标)运算来赋值:

IDL>A[1,*]=A[1,*]*3

数组下标中“*”代表该维的所有元素。下标运算也可通过“:”指定区间:

IDL>A[0:1,*]=A[0:1,*]*3

3、直接通过赋值来定义数组:

IDL>a=[[[1,2],[1,2]],[[1,2],[1,2]],[[1,2],[1,2]]]

这个数组的结构为:Array[2, 2, 3]

●用一维下标来存取数组

可以使用一维下标来存取数组中的每一个元素。要知道数组元素是以行顺序存储的,例如要获得数组中的第四个元素,可以键入以下语句来存取:

IDL>A=IndGen (3,3)

IDL>Print, A[3]

这样就可以打印出数组A的第4个元素,要注意IDL中数组是按行存储。用一维下标可以存取多维数组中的元素,这是IDL语言的一个强大的工具。也可以用一维向量来做数组的下标。例如,倘若要存取数组中的第一,二,四和第六个元素,可键入:

IDL>indices=[0,1,3,5]

IDL>Print, A[indices]

(5)系统变量

IDL有一类特殊的预定义系统变量,系统变量通常是以“!”开头的,在这里我们只介绍几组常用的系统变量,在直接图形法(图形只可输出,不能进行交互操作)输出中会常用到。

●!d 系统变量

提供当前显示设备的信息,此类系统变量包含如下系统变量:

●!p系统变量;

更改默认的画图设置,此类系统变量包含如下系统变量:

●!x,!y,!z系统变量

更改在画图上坐标轴的默认属性,此类系统变量包含如下系统变量(如前述系统变量,在前面加!x,!y,!z):

(6)结构体

结构是标量、数组,以及结构本身的集合,不同数据类型的变量可以用结构来存储。结构的基本形式是:StrName={name,Var_name1: Var_Def1,…, Var_nameN: Var_DefN}。Var_namei为结构成员名称,Var_Def1 为该成员的定义。Name存在,则该结构为命名结构,否则为模糊结构。命名结构在运行过程中不可以改变结构,但模糊结构可以。结构的引用为StrName.Var_name1 或 Name.Var_name1。结构可以继承(但不传递初始值):

匿名结构体

IDL>person={name:’li’,number:4567}

IDL> print,person

IDL> help,person

IDL> help,person,/structure

获取结构体变量

IDL> print,https://www.doczj.com/doc/3c15369303.html,

IDL> print,person.(1)

调整结构体变量

IDL> https://www.doczj.com/doc/3c15369303.html,='wang'

IDL> print,person

结构体的变量类型不能改变

IDL> person.number=float(person.number)

IDL> help,person,/structure

创建结构体数组

IDL> se=replicate(person,10)

IDL> print,se se是10个personal

署名结构体

IDL> dot={pixel,x:128,y:236,color:byte(3)}

IDL> help,dot,/structure

新的署名结构体

IDL> point1={pixel} ‘引用

IDL> help,point1,/structure

** Structure PIXEL, 3 tags, length=6, data length=5:

X INT 0

Y INT 0

COLOR BYTE 0

IDL> point2={pixel,45,78,127}

IDL> help,point2,/structure

** Structure PIXEL, 3 tags, length=6, data length=5:

X INT 45

Y INT 78

COLOR BYTE 127

2、数组性质

当需要获取关于数组性质的一些函数时,如数组元素数目,数组大小和类型,平均值等,需要用到如下函数:

数组元素的数目n_elements(), 数组大小和类型size(), 最小值min(), 最大值max(), 平均值mean(), 方差variance(), 标准差

注:重点掌握size()函数

IDL> arr=findgen(256,256)

IDL> print,n_elements(arr)

IDL> print,size(arr)

2 256 256

IDL> print,size(arr,/n_dimensions) 返回是几维数组

2

IDL> print,size(arr,/dimensions)

256 256

IDL> print,size(arr,/type)

4

IDL> print,size(arr,/tname)

FLOAT

DL> print,size(arr,/n_elements)

65536

类型代码

3、数组元素的定位

IDL> print,arr

0 10 40 50 60 70 80 90

IDL> print,index

4 5 6 7 8 9

(注意index是什么变量)

IDL> print,arr(index)

40 50 60 70 80 90

IDL> print,arr(index[0])

40

4、简单数组函数:

Reform()函数

Reform()函数可以使数组在固定元素个数的前提下,改变下标引用索引。显然Reform()函数可以改变数组的维数,例如:

IDL>a = Intarr(10,10,10)

IDL>c = Reform(a,200,5) (与下等价)

IDL>d = Reform(a,[200,5]) (与上等价)

IDL>e = Reform(a,[200,50]) (元素个数增多,错误)IDL>e = Reform(a,[20,5]) (元素个数减少,错误)

Reform()函数将在以下方面产生很好的应用效果;

1、简化数组调用;

2、进行数组索引动态调整,以便不同模式下的引用。

数组重排列函数

1、改变数组维数

IDL> arr=[0,20,40,60,80,100]

IDL> arr=reform(arr,3,2)

IDL> print,arr

0 20 40

60 80 100

2、转换元素顺序

IDL> arr=indgen(5)

IDL> print,arr

0 1 2 3 4

IDL> print,reverse(arr)

Compiled module: REVERSE.

4 3 2 1 0

IDL> arr=indgen(3,3)

IDL> print,arr

0 1 2

3 4 5

6 7 8

IDL> print,reverse(arr)

2 1 0

5 4 3

8 7 6

IDL> print,reverse(arr,1)

2 1 0

5 4 3

8 7 6

IDL> print,reverse(arr,2)

6 7 8

3 4 5

0 1 2

注意reverse函数中1,2两个参数意味着什么

3、旋转数组

IDL> arr=indgen(4,3)

IDL> print,arr

0 1 2 3

4 5 6 7

8 9 10 11

IDL> print,rotate(arr,1)

8 4 0

9 5 1

10 6 2

11 7 3

IDL> print,rotate(arr,2)

11 10 9 8

7 6 5 4

3 2 1 0

IDL> print,rotate(arr,3)

3 7 11

2 6 10

1 5 9

0 4 8

注意rotate函数中1,2,3三个参数意味着什么

4、转置数组Transpose

IDL> arr=indgen(4,3)

IDL> print,arr

0 1 2 3

4 5 6 7

8 9 10 11

IDL> print,transpose (arr)

5、练习

练习1:分别建立字节型变量,16位有符号整型变量,浮点型变量,字符串。用HELP函数查看变量的属性。将字符串转变为字节型变量,将整型转换为字节型变量。

练习2:IDL>num = 3 ; num是一个整型变量

IDL>num = num*5.2 ; num变为一个浮点型变量

如何使num在上式计算完毕后仍为整型变量。

练习3:创建100×100初始值为零的浮点型数组

练习4:创建一个有100个元素的字节型矢量,初始数值为从0到99。思考元素个数超过256个时会有何变化。

练习5:vector=FIndGen(10,10),print该变量第二行的前5个元素。

练习6:(1)建立一个3列4行的浮点型数组,并将数组中的元素赋值如下:

1.00000

2.00000

3.00000

2.00000 4.00000 6.00000

3.00000

4.00000

5.00000

1.00000 8.0000027.0000

注,通过数组索引和矩阵运算来赋值

(2)print出该数组中蓝色字体的元素。

(3)用reform函数将上述数组变为一个1行的数组

练习7:以student为名建立一个匿名结构体,结构体中包含两个变量,第一个变量为name,是一个1列3行的字符串矩阵,第二个变量为num,是一个1列3行的浮点型矩阵。

接下来定义name为你的3个同学的名字,num为他们相应的电话号。查看你创建的结构体是否正确。

练习8:建立一个数组,计算数组最大值,最小值,平均值

练习9:如果想用size函数返回一个变量,如:a=size(arr),那么思考一下a的数据类型是什么?

(四)数据的输入与输出

在使用IDL处理数据时,经常需要输入一些数据,而且常常需要把处理后的数据输出。这就需要我们了解数据的标准输入、输出方法和数据的格式输入输出方法。

1、输入输出格式代码

输入格式:READ, 变量1, …, 变量n, FORMA T=’(格式描述)’[,PROMPT=’提示信息’]

输出格式:PRINT, 表达式1, …, 表达式n, FORMA T=’(格式描述)’

例子:

IDL>year=0 & month=0 & day=0

IDL>READ,year,month,day,PROMPT=’请输入年月日’,FORMAT=’(I4,I2,I2)’

IDL>PRINT,year,month,day,FORMAT=’(I4,”/”,I2,”/”,I2)’;输出2010/05/19

Openr 打开一个存在的文件并用于只读

Openw 打开一个用于读写的文件,---存不存在都可以

Openu 打开一个存在的文件并用于读写

Findfile()返回当前文件夹中的文件名

Dialog_pickfile() 图形文件选择器,-----对话框

Fstat() 返回一个已打开文件的信息

Eof()检测文件尾

Close 关闭文件

Free_lun释放逻辑设备号并关闭文件

打开文件

注意:逻辑设备号是IDL6.3允许使用的逻辑设备的编号。由于文件的读写操作是通过与该文件相关联的逻辑设备号来对该文件进行读写的,所以在对文件读写时,必须先打开文件,并且赋予以一个逻辑设备号。IDL6.3允许使用的逻辑设备号的范围为-2,-1,0,…,128;其中-2,-1,0分别用于标准错误、标准输出和标准输入;1~99为用户可以使用的逻辑设备号;100~128为使用关键字/GET_LUN时,系统自动分配给文件的逻辑设备号。

每一个打开过程都需要以一个逻辑设备号来引用文件。逻辑设备号是一个长整型标量,可以设置为1—99

IDL> lun=20l

IDL> openw,lun,'test.dat'

但是,更好的方法是通过可选关键字get_lun来赋予自由逻辑设备号,自由逻辑设备号为100—128

IDL> openw,lun,'test.dat',/get_lun

关闭文件

IDL> close,lun

IDL>openw,lun,'test.dat',/get_lun

IDL> free_lun,lun

IDL> close,/all

选择文件

findfile()函数返回一个字符串数组

IDL> list=findfile()

IDL> print,list

过滤数据

IDL> list=findfile('*.dat')

图形文件选择器

IDL> file=dialog_pickfile()

IDL> file=dialog_pickfile(filter='*.dat')

获取文件信息

IDL>info=fstat(lun)

IDL> help,info.size,info.read,https://www.doczj.com/doc/3c15369303.html,

LONG

=

149600

BYTE = 1

STRING = 'C:\RSI\IDL63\examples\data\hurric.dat' IDL> free_lun,lun

3、读写有格式(Readf 读文件 Printf 写文件

IDL> file=dialog_pickfile() IDL> openr,lun,file,/get_lun

IDL> readf,lun,data

IDL> print,data

IDL> close,/all

-156.9500, 20.7833, 399, 68, 64, 10, 60 -116.9667, 33.9333, 692, 77, 50, 8, 270 -104.2545, 32.3340, 1003, 87, 50, 10, 340 -114.5225, 37.6073, 1333, 66, 35, 0, 0 -106.9418, 47.3222, 811, 68, 57, 8, 140 -94.7500, 31.2335, 90, 89, 73, 10, 250 -73.6063, 43.3362, 100, 75, 64, 3, 180 -117.1765, 32.7335, 4, 64, 62, 5, 200 -116.0930, 44.8833, 1530, 55, 51, 0, 0 -106.3722, 31.8067, 1206, 82, 57, 9, 10 -93.2237, 30.1215, 4, 87, 77, 7, 260 -109.6347, 32.8543, 968, 80, 46, 0, 0 -76.0225, 43.9867, 99, 75, 66, 7, 190

IDL> file=dialog_pickfile() IDL> openw,lun,file,/get_lun IDL> printf,lun,data IDL> close,/all

4、读写无格式文件 读readu 写writeu

IDL> file=filepath('ctscan.dat',subdir='examples\data') 找到文件位置 主路径:安装路径

IDL> openr,lun,file,/get_lun 只读

IDL> data=bytarr(256,256) 定义一个变量,是一个数组

IDL> readu,lun,data 读到data

IDL> tv,data

IDL> close,/all

练习10:将data变量存储为一个无格式的数据文件。

IDL> data=dist(256)

Compiled module: DIST.

IDL> file=dialog_pickfile()

IDL> openw,lun,file,/get_lun

IDL> writeu,lun,data

IDL> close,/all

给一个无格式数据加头文件

IDL> info=size(data)

IDL> print,info

2 256 256 4 65536

IDL> openw,lun,file,/get_lun

IDL> info_size=n_elements(info)

IDL> print,info_size

5

IDL> header=[info_size,info]

IDL> printf,lun,header

IDL> writeu,lun,data 区别在于printf能看到,不乱码

IDL> free_lun,lun

练习11:读取上述文件中的头文件信息,用头文件中的信息来读取文件中的数据,并将该数据赋值给一个变量,显示该变量。

实验二:IDL绘图

目的:掌握IDL绘制线画图的方法;掌握IDL绘制曲面图和等值线的方法。

原理:PLOT、OPLOT、Surface、Shade_surf、Contour的使用规则

软件:IDL

内容:

(一)绘制线画图

1、创建线画图

生成线画图最简单的方法是绘出一个矢量。可以用LoadData命令打开时序数据集。它用来装载IDL的例程中所需的数据。打开并编译LoadData程序,键入如下语句以查看所能使用的数据集:

IDL>curve=LoadData()

另外一种选择第一个数据集的方法是,按如下方法使用LoadData:

IDL>curve=LoadData(1)

要查看curve变量如何被定义,键入:

IDL>Help, curve

CURVE FLOAT =Array[101]

将发现curve是一个具有101个元素的浮点矢量(或一维数组)。

要绘出该矢量,可键入:

IDL>Plot, curve

IDL试图用少量的信息尽可能地绘出漂亮的线画图。在这种情况下,x轴或水平轴被标识为从0到100,这与矢量中的元素个数相对应。而y轴或垂直轴则是用数据坐标来标识(它是取决于数据的坐标轴)。

但大多数情况下,线画图用于显示一组数据(独立数据)相对另外一组数据(非独立数据)的关系。例如,上面的曲线可能代表在某段时间内采集数据的信号。可能需要绘制某个时刻的信号值。在这种情况下,需要一条与该曲线矢量具有相同元素个数的矢量(这样可以获得一一对应的相关性),并将该矢量转换为实验中所用的时间单位。例如,可以创建一个时间矢量,并绘出它与上述曲线矢量的关系图:

IDL>time=FIndGen(101)*(6.0/100)

IDL>Plot, time, curve

FIndGen命令创建一个元素值为0到100的共101个元素的矢量。乘法因子按比例缩小每个元素的大小,最后的结果是一个元素值为0到6之间的共101个元素的矢量。图形输出结果:

独立数据(时间)与非独立数据(曲线)关系图

注意,在此图中的坐标轴上没有相应的标题。在图上设置标题是很容易的,只要用XTitle和YTitle关键字即可实现。例如,为此曲线图加标题,可键入:

IDL>Plot, time, curve, XTitle='Time Axis', $

YTitle='Signal Strength'

甚至可以用Title关键字对整个图形设置标题,键入:

IDL>Plot,time,curve,XTitle='Time Axis',$

YTitle='Signal Strengh',Title='Experiment 35M'

输出结果:

简单的带坐标轴标题和图形标题的线画图

注意,图形显示可以根据需要改成在白色背景下的黑线图,而上图显示为在黑色背景下的白线。将系统变量的背景与前景色更改即可。

IDL> !P.BACKGROUND='FFFFFF'XL

IDL> !P.COLOR='000000'XL

IDL>plot,time,curve

注意,图形标题稍微大于坐标轴的标题。事实上,是1.25倍的关系。可以用CharSize 关键字改变所有图形注记的大小。例如,可以将坐标轴标题的字符放大50%:

IDL>Plot, time, curve, XTitle='Time Axis',$

YTitle='Signal Strength', Title='Experiment 35M', $

CharSize=1.5

甚至可以用[XYZ]CharSize关键字单独改变每个轴的标识字符的大小。例如,如果想使Y轴的注记比X轴的大两倍,则可键入:

IDL>Plot,time,curve,XTitle='Time Axis',XCharSize=1.0,$

YTitle='Signal Strength',YCharSize=2.0

2、定制线画图

上面是简单的线画图,除了数据本身外,没有很多其他信息。然而,有许多方法可用来定制和标注线画图。Plot函数可以被50多种不同的关键字修饰。

1.改变线型或粗细;

2.使用符号,符号之间可以有线条和没有线条存在;

3.改变刻度标记的长度或刻度标记之间的间隔;

4.改变绘图范围来绘出感兴趣的数据段;

5.删除坐标轴或改变绘图方式。

改变线条的线型和粗细

例如,想用不同的线型画出数据。如画一条线型为长虚线的线条,可以这样实现:IDL>Plot, time, curve, LineStyle=5 !P.BACKGROUND='FFFFFF'XL

!P.COLOR='000000'XL Plot, time, curve

对于线画图来说,可通过LineStyle关键字选用下表中列出的索引号确定不同的线型。例如,想使用虚线画出曲线,可以把LineStyle关键字的值设置为2:

IDL>Plot, time, curve, LineStyle=2

LineStyle关键字不同索引号对应的线型

线画图中线的粗细同样能够被改变。例如,如果想使用比正常值粗3倍的虚线来显示图形,可键入:

IDL>Plot, time, curve, LineStyle=2, Thick=3

用符号代替线条表示数据

假如想用符号代替线条表示数据,就像LineStyle关键字一样,也存在类似的索引号供选择,以确定不同的线画图符号。下表给出了能通过PSym(绘图符号)关键字来选择的索引号。例如,可以通过设置PSym为2,用星号来绘图,如下:

IDL>plot, time, curve, Psym=2

输出的图形:

用符号而不是线条来显示线画图

PSym关键字的引用在绘图中使用不同的符号。注意,绘图符号为负值时表示用线条来连接相应的符号

用线条和符号来显示数据

赋予PSym关键字一个负值就可以用线条将图形符号连接起来。例如,可用实线与三角形符号绘出数据,键入:

IDL>Plot, time, curve, PSym=-5

为创建一个更大的符号,可用SymSize关键字。下面的语句画出的符号为正常的两倍。符号值为4时符号的大小为正常值的4倍,依此类推。

IDL>Plot, time, curve, PSym=-5, SymSize=2.0

限定线画图的范围

并非所有的数据都必须在一个线画图中绘出,可以用关键字限定绘图的数据量。例如,可仅绘出位于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]

如果所选择的轴的范围不适合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这些关键字改变线画图的特性。下表给出了可通过这些关键字来改变线画图风格的值。例如,为除去方框线,只留下X轴或Y轴,可键入:

IDL>Plot, time, curve, XStyle=8, YStyle=8

[XYZ]Style关键字参数表,用于设置坐标轴的属性。

注意:这些值可以累加从而设置坐标轴的多个而非单个属性

可以完全隐藏一个轴。例如,仅用Y轴显示图形,可键入:

IDL>Plot, time, curve, XStyle=4, YStyle=8

输出结果:

关闭X轴和方框只剩Y轴的线画图

[XYZ]Style关键字可以一次设置坐标轴的多个特性。可以通过累加适当的值来实现。例如,可以从上表中看出,强制使用精确的坐标轴范围的参数值为1,而用来删除方框线的参数值为8。为实现上述两项功能,即让X轴显示精确的范围又隐藏方框线,可将两个参数值相加:

IDL>plot, time, curve, xstyle=8+1, xrange=[2, 5]

在线画图上创建网格线,通常可用TickLen关键字来完成。如下:

IDL>Plot, time, curve, TickLen=1

将[XYZ]TickLen关键字设置为一个负值可以创建向外的刻度标记。例如,为创建向外的刻度标记,可键入:

IDL>Plot, time, curve, TickLen=-0.03

可以用Y轴和Y方向的网格线来显示同一幅图:

IDL>Plot, time, curve, XStyle=4, YTickLen=1, YGridStyle=1

在某个轴上创建向外的刻度标记,可将[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

3、在线画图上绘制多种数据集

读者可以不仅仅用一组数据绘制线画图。IDL程序允许在同一套坐标轴内显示任意多套数据。OPlot命令就用于此。键入以下命令,输出结果如下图:

IDL>Plot, curve

IDL>OPlot, curve/2.0, LineStyle=1

IDL>OPlot, curve/5.0, LineStyle=2

相关主题
文本预览
相关文档 最新文档