lihuixian的个人博客分享 http://blog.sciencenet.cn/u/lihuixian

博文

使用IDL语言画图的一些记录

已有 17515 次阅读 2013-9-24 16:58 |个人分类:科研工具-IDL|系统分类:科研笔记| 记录

(一)画灰度图和等值线图过程中记录的一些细节:

 

1、向钱磊学习使用TVimage.pro画灰度图:

TVimage, BytScl(image, Top=ncolor), x, y, Position=position, /Keep_Aspect, /Erase, /NoInterpolate

以使用13CO的数据画云核的灰度图为例说明上面各参数代表的意义:

image为灰度值,也就是13CO在云核速度区间的积分强度值。

Top为使用的颜色表中颜色的数目如可取256。

x和y分别为所画图的横坐标和纵坐标。

position同contour过程的position,代表所画图在.ps或.eps文件中的位置。 

注意:

(1)如果在灰度图上还要叠加等值线图,则在主程序中需把TVimage放在contour之前。因为TVimage里 对所画图的位置重新做了调整,如果将TVimage放在contour之后,在叠图时可能会出现偏差。另外也因为TVimage对画图位置的重新调整,一般使用TVimage画图时要输出到.ps或.eps文件中,如果直接输出到屏幕往往会有问题。

(2)将TVimage.pro放在主程序可以找到的路径中,最好和主程序放在同一文件夹。

 

2、向钱磊学习如何在积分强度图里画波束形状:

使用ellipse.pro这一过程来画:ellipse,major,minor,angle,a1,a2,x,y,color=100

该过程调用了如下子过程

rotate_xy.pro

makex.pro

各参数表示的意义如下:

如果波束形状为椭圆形,则major和minor分别表示椭圆的半长轴和半短轴。如果波束形状为圆形,则major和monior相等,为圆的半径,也就是波束的一半。

angle表示波束长轴沿着逆时针方向与x轴的夹角。也即波束的倾斜角度angle of major axis(deg CCW from X axis),这里CCW是counter clockwise的缩写即逆时针。如果波束是圆形,该角度取多少都一样。

a1表示起始角度,a2表示截止角度。如果画整个波速则a1=0.0,a2=360.0。

x,y为波束中心点坐标。

color值表示所画波束的颜色。

以在我画的outflow的contour map的左下角画黑色的FCRAO的波束为例(FACRAO的波束大小为45角秒),代码如下:

;code begin

;plot the beam on the map
major=45.0/2/3600
minor=45.0/2/3600
beam_x0=ra_0+(left_arcmin-0.5)/60.0
beam_y0=dec_0-(down_arcmin-0.5)/60.0
ellipse,major,minor,0.0,1.0,360.0,beam_x0,beam_y0,color=0

;code end

以上画出的是未填充的只有一个圆环的(open circle)波束形状。

下面步骤可以实现画出填充的圆形(filled circle)波束形状。

题外话:该过程是我自己第一次通过google搜索源代码实现的,看到画出了符合自己要求的图还是小高兴了一下,虽然在网络上搜索解决问题应该是博士生的必备技能。第一次独立完成搜索代码实现功能对建立这方面的自信很重要,会为逐渐积累技能打下基础。

画填充的椭圆形波束使用tvellipse.pro(当然,也可用它画填充的圆形波束,只要设置椭圆的半长轴和半短轴均为圆形的半径即可)。该过程调用了如下8个过程:

cgplots.pro
error_message.pro
setdecomposedstate.pro
decomposedcolor.pro
cgdefaultcolor.pro
cgcolor24.pro
cgcolorfill.pro
getdecomposedstate.pro

上面的.pro文件都存在一个名为coyotelibrary_26sep2013.zip的压缩包中,是Fanning Software Consulting, Inc开发的。

使用tvellipse画一个填充的波束形状的语句为:tvellipse, major,minor,beam_x0,beam_y0,pos_ang, color, /fill, /DATA

这里major和minor分别表示椭圆的半长轴和半短轴的长度,如果画圆形波束,该两个值均为圆的半径;beam_x0和beam_y0为所画波束中心在图(一般是积分强度)上的坐标,其单位与图的坐标单位一致。pos_ang表示所画椭圆形状的倾斜角度,如果画圆形则无倾斜角度之说故可取任意值。 color为所画椭圆的颜色。/fill表示用颜色填充所画形状。/DATA表示椭圆的半径及中心坐标与所画图的坐标轴保持一致。如果椭圆的中心坐标为负值,则必须设置该参数。如画积分强度图使用相对坐标(offset)时,波束中心的坐标可能为负值如(4,-2),此时使用tvellipse.pro画波束必须加/DATA。而上面的ellipse.pro则默认是有/DATA的,所以程序中在ellipse.pro里不用再画蛇添足地加/DATA了。

上面过程实现了在积分强度图上画出填充的椭圆形或圆形波束的功能。在这一过程中调用的子程序多达8个,在IDL的图形界面workbench环境下需要对每个子程序进行编译,这既麻烦又易漏掉。实际上可以使用图形界面上的命令行或者IDL纯粹的命令行方式只编译主程序,然后就可以执行。但这需要注意一点:程序的文件名必须全部为小写字母。另外注意,程序名和文件名在字母上必须一致,但可以忽略大小写。也就是说如果文件名为iim_spitzer.pro,该文件里面编写的程序可以为:

pro IIM_Spitzer

.....

end

这可能是因为shell只认小写,而IDL可以忽略大小写。所以为了少出错,IDL程序的文件名都应采用小写字母。事实上无论是IDL天文包里的程序文件名还是在网上搜到的很权威的Fanning Software Consulting, Inc公司的IDL程序文件名,它们都是使用小写字母命名的。

我在编写程序时一开始没有注意文件名必须小写的问题,当时为了看着直观文件名里也有大写字母如IIM_Spitzer.pro。这就导致无法实现只编译主程序而不编译子程序就能执行的问题。在钱磊的帮助下在不改变文件名的情况下也找了了一个解决办法。那就是写一个脚本(不是IDL程序,所以不是以pro 程序名开始以 end结束),其内容就是编译所用到的子程序。过程如下:

首先创建脚本文件compile_test:vi compile_test

然后编辑脚本文件,输入内容如下

.com IIM_Spitzer
.com tvellipse
.com cgplots
.com error_message
.com setdecomposedstate
.com decomposedcolor
.com cgdefaultcolor
.com cgcolor24
.com cgcolorfill
.com getdecomposedstate
.com Main_IIM_Spitzer

保存退出

执行 idl compile_test,则对compile_test中列出的编译一一执行。

如果执行 idl < compile_test,则对compile_test中列出的编译一一执行后退出IDL。

注意上述脚本compile_test不是IDL程序,不是以pro compile_test开始,以end结束的。

参考钱磊的博客:关于命令行直接运行IDL脚本 http://blog.sciencenet.cn/blog-117333-305128.html

综上所述:如果IDL程序文件名均采用了小写字母命名,在调用多个子程序的情况下,编译运行可以采用命令行方式(图形界面workbench的命令行也可)更简便(只要编译主程序,无需对子程序一一编译),调试程序时采用图形界面方式更简便。

 

3、在叠加了灰度图的积分强度图上使坐标刻度明显(Thanks to Prof.Di Li and Dr.Lei Qian)

需求:整张图的坐标轴用黑色画,坐标值也用黑色字体表示,但是坐标的刻度用白色小竖杠向里标出。

实现步骤:先使用第0个颜色表的白色(即contour过程中设置color=256)画出坐标轴和刻度,并标上坐标值。再使用该颜色表的黑色(即在使用contour.pro中设置color=0)画出坐标轴并标上坐标值,但是设置ticklen=0,即不画刻度而还保留上一步画出的白色的刻度。具体代码如下:

 ;plot axes begin

 loadct, 0, ncolors = 256
 ;plot the axes(set /nodata) with white color first to let the tick white.
 contour, result_red, RA_deg, DEC_deg, title = source_name, xtitle= '!17 R.A.(J2000)', ytitle ='Dec.(J2000)', xtickname = xtickname, ytickname = ytickname, xticks = n_elements(xtickname)-1, $
   yticks = n_elements(ytickname)-1, xstyle = 1, ystyle = 1, xrange = [max_RA_deg,min_RA_deg], yrange = [min_DEC_deg, max_DEC_deg], color=256, POS=position, xmargin=0, ymargin=0,  /nodata, /isotropic, /noerase


 ;plot the axes(set /nodata) with black color and set ticklen=0 to let only the tick white and others black.
 contour, result_red, RA_deg, DEC_deg, title = source_name, xtitle= '!17 R.A.(J2000)', ytitle ='Dec.(J2000)', xtickname = xtickname, ytickname = ytickname, xticks = n_elements(xtickname)-1, $
   yticks = n_elements(ytickname)-1, xstyle = 1, ystyle = 1, xrange = [max_RA_deg,min_RA_deg], yrange = [min_DEC_deg, max_DEC_deg], color=0, POS=position, xmargin=0, ymargin=0, ticklen=0, /nodata, /isotropic, /noerase

;plot axes end

 注意:第2个contour后面不能加/overplot。加上之后坐标轴是白色的而且图上的源名和刻度值都没有了。我还没想明白为什么会这样。

补充:如果设置ticklen为负值,则刻度标尺向图的外面画。

 

4、在图上画五角星

IDL自带的psym=2可以画出星号,但是画出来后更像雪花的形状,画在图上不如填充的五角星美观。虽然IDL没有自带画五角星,但可以通过使用usersym来画,于是在网上搜到了相关代码,改到我的程序里,很好用。

在图中某个位置画填充的绿色五角星的代码如下:

;code begin

loadct, 40, ncolors = 256        

x=[0.0, 0.5, -0.8, 0.8, -0.5, 0.0]
y=[1.0, -0.8, 0.3, 0.3, -0.8, 1.0]
UserSym, x, y,/Fill

oplot, ra, dec, PSym=-8, thick=2, SymSize=0.4, color = 150

;code end

上面代码中的x和y对应组成的坐标点代表了画五角星时走过的轨迹。



https://wap.sciencenet.cn/blog-473646-727508.html

上一篇:我的科研笔记-2013
下一篇:IDL资源
收藏 IP: 159.226.171.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-21 22:24

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部