发表于 2013-03-06
IDL 8.2.2为IDL图形进行了一些功能改进,新增了几个函数过程和一个系统变量,提供了Widget组件编程的新特性,极大地提升了如PLOT等函数的启动速度。并简化了ENVI自定义工具的创建。工作台编辑器的功能有了改进和增加。
在IDL8.2.2帮助中新增了一个技巧专题。此专题在以后会一直进行扩充,可以帮助用户编写的程序更加简单高效。
现在可以使用BOXPLOT函数绘制箱线图。如图所示,提供一个N列5行的数组(其中N为绘制图形个数),每一列对应一个图形,5个元素分别对应图中箭头所示位置的Y值。
你可以自定义输入数组的值,也可以使用CREATEBOXPLOTDATA函数自动生成。
图:BoxPlot函数示例
顾名思义,CreateBoxPlotData函数是为BoxPlot函数创建数据的。自动计算输入数组每一列的最小值(排除可能的异常值)、下四分之一值、中值、上四分之一值、最大值(排除可能的异常值)。
bike_mph = [ $ [12.2, 16.2], $ [12.1, 16.4], $ [10.7, 16.9], $ [11.6, 17.0], $ [10.2, 16.5], $ [10.9, 16.1], $ [11.8, 17.1], $ [10.9, 100.0], $ ;存在一个异常值100.0,看结果已经排除此异常值,最大值为17.50 [12.4, 16.8], $ [12.9, 16.9], $ [13.1, 17.5], $ [13.0, 17.4]] bpd = CREATEBOXPLOTDATA(bike_mph, MEAN_VALUES=means, OUTLIER_VALUES=outliers) PRINT, bpd 10.200000 16.100000 10.900000 16.424999 11.950001 16.900000 12.775000 17.324999 13.100000 17.500000
IMAGE_THRESHOLD函数返回一个二值图像,大于阈值则为1,小于阈值则为0。可选的自动阈值算法有:Isodata、Otsu、Moments、Maxentropy、Minerror和Mean。如图所示,上图为原始图像,下图为返回的二值图像。
图:IMAGE_THRESHOLD函数示例
SCATTERPLOT和SCATTERPLOT3D函数可以绘制二维和三维散点图。
图:SCATTERPLOT函数示例
TIC和TOC程序可以获取IDL程序的运行时间。TIC程序可以被用作过程或函数。当TIC被当作过程调用时,TIC和TOC可以输出被调用之间的运行时间。当TIC被用作函数调用时,TOC程序可以计算TIC指定过程的运行时间。这样便可以计算子程序和循环内的运行时间。TIC和TOC程序同样可以被用来启动和禁止IDL代码分析器。
!CONST系统变量格式为IDL结构体,包含了常用的物理常数。例如,使用里德伯常量计算氢原子跃变放射出的光波长。
首先核查里德伯常量的值:
PRINT, !CONST.me*!CONST.ev^4/(8*!CONST.eps0^2*!CONST.h^3*!CONST.c) PRINT, !CONST.Rydberg IDL prints: 10973732. 10973732.
现在计算从n=2到基态的转换:
PRINT, 1e9/(!CONST.Rydberg*(1 - 1./4)), " nm" IDL prints: 121.50227 nm
RANDOMU和RANDOMN函数现在使用Mersenne Twister算法来生成随机数。Mersenne Twister算法相对旧版随机数生成器来说,是一个重大改进。
如果想要使用旧版算法,可以使用RAN1关键字。
CURRENT关键字升级了,用户可以指定此关键字等于已经存在的图形窗口,则指定的图形窗口自动变为当前窗口。
当显示图像具有地图投影时,IDL自动设置图像的地图范围。同样可以添加显示Box Axes,而不需要手动计算范围。
图:显示图像在某地图投影下,可以自动添加Box Axes
现在可以显示所有地图投影类型的边界。MAP和MAPGRID函数有三个相关属性:HORIZON_COLOR、HORIZON_LINESTYLE和HORIZON_THICK。例如:
; Create a map using the interrupted Goode projection. mGoode = MAP('Interrupted Goode', FILL_COLOR='light blue', $ HORIZON_COLOR='red', HORIZON_THICK=3, TITLE='Interrupted Goode') mc = MAPCONTINENTS(/FILL_BACKGROUND, FILL_COLOR='gray')
图:地图视界显示示例
在所有图形对象中添加了新的POSITION属性。在之前的版本,只能对“main”图像函数使用POSITION属性,例如PLOT、CONTOUR。在创建时,POSITION可以被设置为含有4个元素的向量,[X1, Y1, X2, Y2],分别对应了左下角和右上角的坐标。如果设置为2个元素的向量,则为要显示图形的中心点位置。
所有图形函数的启动速度有了极大的提升。其中,利用硬件渲染明显提升了PLOT函数的速度,特别是在绘制大数据量的点时。例如:
;IDL8.2.2版本测试代码 n = 1e6 x = RANDOMU(seed, n) PRINT, 'Graphics functions:' FOR i=0,2 DO BEGIN & TIC & p = PLOT(x) & TOC & p.CLOSE & ENDFOR PRINT, 'Direct graphics:' FOR i=0,2 DO BEGIN & TIC & PLOT, x & TOC & WDELETE & ENDFOR ;IDL8.0及之前版本测试代码 n = 1e6 x = RANDOMU(seed, n) PRINT, 'Graphics functions:' FOR i=0,2 DO BEGIN & start = systime(1) & p = PLOT(x) & print, systime(1)-start & p.CLOSE & ENDFOR PRINT, 'Direct graphics:' FOR i=0,2 DO BEGIN & start = systime(1) & PLOT, x & print, systime(1)-start & WDELETE & ENDFOR
IDL8.2.2 prints:
Graphics functions: % Time elapsed: 2.3860002 seconds. % Time elapsed: 2.1719999 seconds. % Time elapsed: 2.1790001 seconds. Direct graphics: % Time elapsed: 0.73799992 seconds. % Time elapsed: 0.64499998 seconds. % Time elapsed: 0.63299990 seconds.
IDL8.0 prints:
Graphics functions: 17.503000 7.6090000 7.4710000 Direct graphics: 0.67799997 0.64600015 0.65400004
使用IDLgrPlot对象时,设置HISTOGRAM = 2可以超出数据的范围。或设置HISTOGRAM = 3,将水平线的起始点落在每一个X位置,而不是中心位置。
PLOT和BARPLOT函数均添加了新的HISTOGRAM属性。区别在于直方图的起始点位置不同。如下面的例子所示。
h = HISTOGRAM(5*RANDOMU(1,25), BINSIZE=1, MIN=0.0, LOCATIONS=loc) ex = {THICK:2, XRANGE:[-0.5,5.5], YRANGE:[0,10], $ XMINOR:0, XTICKLEN:0.02, YMINOR:0, YTICKLEN:0.02} p1 = PLOT(loc, h, /STAIRSTEP, LAYOUT=[2,2,1], $ _EXTRA=ex, XTITLE='Plot Stairstep') p2 = PLOT(loc, h, /HISTOGRAM, LAYOUT=[2,2,2], $ _EXTRA=ex, /CURR,XTITLE='Plot Histogram') p3 = BARPLOT(loc, h, LAYOUT=[2,2,3], _EXTRA=ex, $ /CURR,XTITLE='Barplot Default') p4 = BARPLOT(loc, h, LAYOUT=[2,2,4], _EXTRA=ex, $ /CURR, /HISTOGRAM, XTITLE='Barplot Histogram')
图:PLOT和BarPlot新的直方图样式
如果调用时不输入任何参数,将自动返回当前源码文件的完整路径。这在读取与源码文件相同路径下的数据时非常有用。
当使用块语句时,输入语句最后一词为“begin”时,按回车会自动补齐“end”。支持的块语句包括:IF/ENDIF、FOREACH/ENDFOREACH、 FOR/ENDFOR、ELSE/ENDELSE、WHILE/ENDWHILE、 CASE/ENDCASE、SWITCH/ENDSWITCH和REPEAT/ENDREP。自动补全的“end”与“begin”具有相同的格式(如全大写、小写、首字母大写等)。
如,当输入“IF 1 then begin”后回车,自动在后边补齐ENDIF。
可以在IDL首选项中设置是否自动补全。如图中红框位置。
图:设置是否自动补全块语句
在IDL工作台的编辑器内粘贴一行或多行语句时,编辑器自动应用默认的格式。相对于之前版本中,等同于粘贴代码后点击源码→格式。
可通过IDL首选项中设置是否使用此功能,如上图中蓝色框中所示位置。