- 积分
- 6662
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-11-25
- 最后登录
- 1970-1-1
|
发表于 2014-6-16 14:58:05
|
显示全部楼层
*******************脚本使用说明***********
*****************************************************************
*[程序设计:清风,来自气象家园论坛 http://bbs.06climate.com] *
* *
******************************************************************************
* 注意:在你display变量前需要先设置如下两个命令 *
* 'set xlpos -20' *
* 'set ylpos -20' *
* 这样能够屏蔽GrADS自带的坐标轴,否则会出现坐标轴重叠 *
******************************************************************************
*请先display变量,再运行该脚本
*该脚本主要实现了自定义的坐标轴显示,您可以免费使用该脚本 *
*该脚本的用法规则如下:
*axis -param1 val1 -param2 val2...
*其中,-param表示需要自定义的参数类型,val表示该参数的具体设定值
*参数和参数值必须成对出现,例如
*axis -type b -position o -sinterval 2
*上面的语句表示绘制类型是底部的x轴,刻度位置是朝外,每两个大的刻度之间显示两个小刻度线
*注意:-type是必选参数
*所有参数如下所示:
*-type :表示绘制类型,参数值有:b/l/t/r 分别表示底部,左侧,上部,右侧
*-label:表示是否绘制数值标签,参数值有:on/off 分别表示绘制和不绘制
*-position:表示刻度的位置,参数值有:o/i/m 分别表示外侧,内侧,中间
*-start:表示刻度 从该处开始绘制,参数值为该轴范围内的数字
*当该轴为时间轴时,表示开始绘制的时次(1,2,3...)
*-end:表示刻度的结束位置,参数值范围同start,时间轴时表示结束的时刻(1,2,3...)
*-interval:表示刻度的间隔,隔多少值绘制一个刻度和标签
*例如,当x轴表示经度110-150E,如果interval为10,默认情况下会标出110,120,130,140,150
*不给定该参数时,默认情况下,会绘制5个刻度,以此确定默认间隔
*-sinterval:表示没两个大刻度之间要绘制几个小的刻度,不给定该参数则不绘制
*-size:表示刻度的长度,单位是英寸,默认为0.1
*-color:表示坐标轴和刻度标签的颜色,默认为1
*-lfont:表示坐标轴标签的字体,默认为当前环境下设置的字体
*-lsize:表示坐标轴标签的字体大小,默认为0.12
*-lthick:表示坐标轴标签字体的粗细,默认为0.3
*-langle:表示坐标轴标签旋转的角度,默认为不旋转
*-suffix:表示需要在每个坐标轴标签后面添加的文字或者符号后缀,比如用来添加度数等
*-asuffix:表示当坐标轴为经纬度轴时,是否自动添加E/W/N/S/EQ这种标记,默认为添加,
*参数值为 on/off ,分别表示自动添加和关闭自动添加
*-hoffset:表示坐标轴标签在水平方向上的偏移量,单位为英寸,正负均可
*-voffset:表示坐标轴标签在垂直方向上的偏移量,单位为英寸,正负均可
*-tformat:当所绘制坐标轴为时间轴时产生作用,表示要显示的时间格式
*参数值为y m d h 这四个字母的任意组合,分别表示年月日时
*如:-tformat my 则会将时间轴标签显示为JAN1951这种格式
*-v:当绘制图形是1-D图(set gxout line等)的时候是必选参数,表示当前display的是哪个变量
function main(args)
'q gxinfo'
line=sublin(result,1)
wrd = subwrd(line,4)
if(wrd = 'clear' | wrd = 'Clear')
say 'Nothing displayed'
return
endif
if(args='')
say 'Usage=>the format of command like'
say 'axis -type b -label on -position o'
say 'that means draw the axis on bottom with label on,an the scale will be outside of the frame'
say 'please open the axis.gs to find more params'
return
endif
line=sublin(result,5)
wrd=subwrd(line,3)
xtype=TypeTran(wrd)
wrd=subwrd(line,6)
ytype=TypeTran(wrd)
if(xtype='E'|ytype='E');say 'E dim is not suppotred by the script yet';return;endif
type=GetVars(args,'type')
label=GetVars(args,'label')
posi=GetVars(args,'position')
ss=GetVars(args,'start')
ee=GetVars(args,'end')
interv=GetVars(args,'interval')
sinterv=GetVars(args,'sinterval')
size=GetVars(args,'size')
color=GetVars(args,'color')
suff=GetVars(args,'suffix')
hoffset=GetVars(args,'hoffset')
voffset=GetVars(args,'voffset')
tf=GetVars(args,'tformat')
v=GetVars(args,'v')
_lfont=GetVars(args,'lfont')
_lsize=GetVars(args,'lsize')
_lthick=GetVars(args,'lthick')
_langle=GetVars(args,'langle')
_autosuff=GetVars(args,'asuffix')
if(type='')
say '-type arg must be set'
return
endif
if(label='');label='on';endif
if(posi='');posi = 'I';endif
if(sinterv='');sinterv=0;endif
if(sinterv<0);sinterv=math_abs(sinterv);endif
if(size='');size=0.1;endif
if(color='');color=1;endif
if(hoffset='');hoffset=0;endif
if(tf='');tf='my';endif
if(voffset='');voffset=0;endif
if(_lsize='');_lsize=0.12;endif
if(_lthick='');_lthick=0.3;endif
if(_langle='');_langle=0;endif
size=math_abs(size)
'q dims'
id=1
xstart=''
ystart=''
xend=''
yend=''
start1=''
start2=''
end1=''
end2=''
while(id<=6)
line=sublin(result,id)
wrd=subwrd(line,1)
if(wrd=xtype)
xstart=subwrd(line,6)
xend=subwrd(line,8)
endif
if(wrd=ytype)
ystart=subwrd(line,6)
yend=subwrd(line,8)
endif
if(xstart!='' & ystart!='');break;endif
id=id+1
endwhile
if(xstart='' )
if(v='');say '1-D plot need -v params';return;endif
GetLineMaxMin(v)
xstart = _lmin
xend = _lmax
endif
if(ystart='')
if(v='');say '1-D plot need -v params';return;endif
GetLineMaxMin(v)
ystart = _lmin
yend = _lmax
endif
if(type='B'|type='b'|type='T'|type='t')
start1 = xstart
end1 = xend
start2 = ystart
end2 = yend
else
start1 = ystart
end1 = yend
start2 = xstart
end2 = xend
endif
if(IsTargAxis(xtype,ytype,type,'T')=0)
if(ss!='');start1=ss;endif
if(ee!='');end1=ee;endif
if(interv='')
icount=5
interv=math_int((end1-start1)/icount)
else
icount=math_int((end1-start1)/interv)
if(icount<0)
icount=math_abs(icount)
interv=math_abs(interv)*(-1)
endif
endif
if(icount>=1000)
say 'Your data undef value my be wrong!'
return
endif
now = start1
nowcount = 1
while(nowcount <= icount+1)
nowlbl=GetLbl(now,xtype,ytype,type,suff)
GetNowPos(type,now,start2,end2)
nowpos.x=_pos.x
nowpos.y=_pos.y
DrawAxis(posi,type,nowpos.x,nowpos.y,size,color,hoffset,voffset,nowlbl,suff,label)
if(nowcount>1 & sinterv != 0)
DrawSAxis(lastpos.x,lastpos.y,nowpos.x,nowpos.y,size,sinterv,posi,type,color,hoffset,voffset,nowlbl,suff)
endif
now = now+interv
nowcount=nowcount+1
lastpos.x=nowpos.x
lastpos.y=nowpos.y
endwhile
else
'q dims'
line=sublin(result,5)
tstart=subwrd(line,11)
tend=subwrd(line,13)
if(ss!='');tstart = ss;endif
if(ee!='');tend=ee;endif
if(interv='')
if((tend-tstart)>10)
interv = 5
else
interv = 1
endif
endif
interv=math_abs(interv)
it = tstart
icount=(tend-tstart)/interv
if(icount>1000)
say 'can't draw any more'
return
endif
while(it<=tend)
'set t 'it''
now = GetDimWrd(5,6)
GetNowPos(type,now,start2,end2)
nowpos.x=_pos.x
nowpos.y=_pos.y
nowlbl=GetTimeLbl(tf,now)
DrawAxis(posi,type,nowpos.x,nowpos.y,size,color,hoffset,voffset,nowlbl,suff,label)
if(it>tstart & sinterv!=0)
DrawSAxis(lastpos.x,lastpos.y,nowpos.x,nowpos.y,size,sinterv,posi,type,color,hoffset,voffset,nowlbl,suff)
endif
it=it+interv
lastpos.x=nowpos.x
lastpos.y=nowpos.y
endwhile
'set time 'start1' 'end1''
endif
say 'welcome to http://bbs.06climate.com'
return
*main function end
function GetLineMaxMin(v)
'q gxout'
line=sublin(result,1)
old=subwrd(line,3)
'set gxout stat'
'd 'v''
_lmax=''
_lmin=''
idx=1
while(1)
line=sublin(result,idx)
wrd=subwrd(line,1)
if(line='');break;endif
if(wrd='Cmin,')
_lmax=subwrd(line,6)
_lmin=subwrd(line,5)
break;
endif
idx=idx+1
endwhile
'set gxout 'old''
return
function DrawSAxis(lastx,lasty,nx,ny,size,sinterv,posi,type,color,hoffset,voffset,nowlbl,suff)
sidx = 1
if(lastx=nx)
dy=(ny-lasty)/(sinterv*1.0)
else
dx=(nx-lastx)/(sinterv*1.0)
endif
nowx=nx
nowy=ny
while(sidx < sinterv)
if(lastx=nx)
nowy=nowy-dy
else
nowx=nowx-dx
endif
DrawAxis(posi,type,nowx,nowy,size/2.0,color,hoffset,voffset,nowlbl,suff,'off')
sidx=sidx+1
endwhile
return
function GetVars(ags,vname)
*idea by QingFeng from http://bbs.06climate.com
res=''
wrd='var'
idx=1
while(wrd!='')
wrd=subwrd(ags,idx)
if(wrd='-'%vname)
idx=idx+1
res=subwrd(ags,idx)
break;
endif
idx=idx+1
endwhile
return res
function DrawAxis(posi,type,posx,posy,size,color,hoffset,voffset,nowlbl,suff,label)
size1 = size/2.0
dh=0.25
dv=0.13
nowpos.x=posx;nowpos.y=posy
if(posi='I'|posi='i')
if(type='b'|type='B')
DrawLine(nowpos.x,nowpos.y,nowpos.x,nowpos.y+size,color)
if(label='on')
DrawLbl(nowpos.x+hoffset,nowpos.y+voffset-dv,nowlbl,color,size,suff)
endif
endif
if(type='l'|type='L')
DrawLine(nowpos.x,nowpos.y,nowpos.x+size,nowpos.y,color)
if(label='on')
DrawLbl(nowpos.x-dh+hoffset,nowpos.y+voffset,nowlbl,color,size,suff)
endif
endif
if(type='t'|type='T')
DrawLine(nowpos.x,nowpos.y,nowpos.x,nowpos.y-size,color)
if(label='on')
DrawLbl(nowpos.x+hoffset,nowpos.y+voffset+dv,nowlbl,color,size,suff)
endif
endif
if(type='r'|type='R')
DrawLine(nowpos.x,nowpos.y,nowpos.x-size,nowpos.y,color)
if(label='on')
DrawLbl(nowpos.x+hoffset+dh,nowpos.y+voffset,nowlbl,color,size,suff)
endif
endif
endif
if(posi='O'|posi='o')
if(type='b'|type='B')
DrawLine(nowpos.x,nowpos.y,nowpos.x,nowpos.y-size,color)
if(label='on')
DrawLbl(nowpos.x+hoffset,nowpos.y-size+voffset-dv,nowlbl,color,size,suff)
endif
endif
if(type='l'|type='L')
DrawLine(nowpos.x,nowpos.y,nowpos.x-size,nowpos.y,color)
if(label='on')
DrawLbl(nowpos.x-size+hoffset-dh,nowpos.y+voffset,nowlbl,color,size,suff)
endif
endif
if(type='t'|type='T')
DrawLine(nowpos.x,nowpos.y,nowpos.x,nowpos.y+size,color)
if(label='on')
DrawLbl(nowpos.x+hoffset,nowpos.y+size+voffset+dv,nowlbl,color,size,suff)
endif
endif
if(type='r'|type='R')
DrawLine(nowpos.x,nowpos.y,nowpos.x+size,nowpos.y,color)
if(label='on')
DrawLbl(nowpos.x+size+hoffset+dh,nowpos.y+voffset,nowlbl,color,size,suff)
endif
endif
endif
if(posi='M'|posi='m')
if(type='B'|type='b'|type='T'|type='t')
DrawLine(nowpos.x,nowpos.y,nowpos.x,nowpos.y+size1,color)
DrawLine(nowpos.x,nowpos.y,nowpos.x,nowpos.y-size1,color)
if((type='B'|type='b') & (label='on'))
DrawLbl(nowpos.x+hoffset,nowpos.y-size1+voffset-dv,nowlbl,color,size,suff)
endif
if((type='T'|type='t') & (label='on'))
DrawLbl(nowpos.x+hoffset,nowpos.y+size1+voffset+dv,nowlbl,color,size,suff)
endif
endif
if(type='l'|type='L'|type='r'|type='R')
DrawLine(nowpos.x,nowpos.y,nowpos.x-size1,nowpos.y,color)
DrawLine(nowpos.x,nowpos.y,nowpos.x+size1,nowpos.y,color)
if((type='l'|type='L') & (label='on'))
DrawLbl(nowpos.x-size1+hoffset-dh,nowpos.y+voffset,nowlbl,color,size,suff)
endif
if((type='R'|type='r') & (label='on'))
DrawLbl(nowpos.x+size1+hoffset+dh,nowpos.y+voffset,nowlbl,color,size,suff)
endif
endif
endif
return
function GetTimeLbl(tf,lbl)
idx=1
res=''
while(1)
wrd=substr(tf,idx,1)
if(wrd='');break;endif
res=res%GetSingleTimeLbl(wrd,lbl)
idx=idx+1
endwhile
if(res='');res=lbl;endif
return res
function GetSingleTimeLbl(tf,lbl)
if(tf='h'|tf='H')
lbl=substr(lbl,1,3)
endif
if(tf='d'|tf='D')
lbl=substr(lbl,4,2)
endif
if(tf='m'|tf='M')
lbl=substr(lbl,6,3)
endif
if(tf='y'|tf='Y')
lbl=substr(lbl,9,4)
endif
return lbl
function GetDimWrd(lidx,widx)
res=''
'q dims'
line=sublin(result,lidx)
res=subwrd(line,widx)
return res
function GetLbl(lbl,xtype,ytype,type,suff)
tmplbl=lbl
lbl=lbl%suff
if(_autosuff='off');return lbl;endif
if(type='b'|type='B'|type='t'|type='T')
comptype = xtype
else
comptype = ytype
endif
if(comptype='X')
if(tmplbl>180|tmplbl<0)
if(tmplbl>180);tmplbl=360-tmplbl;endif
tmplbl=math_abs(tmplbl)
lbl=tmplbl%'`1W'
else
if(tmplbl!=0 & tmplbl!=180)
lbl=tmplbl%'`1E'
else
lbl=tmplbl
endif
endif
endif
if(comptype='Y')
if(tmplbl>0)
lbl=lbl%'`1N'
say lbl
else
if(tmplbl=0)
lbl=lbl%'`1EQ'
else
tmplbl=math_abs(tmplbl)
lbl=lbl%'`1S'
endif
endif
endif
return lbl
function DrawLine(px1,py1,px2,py2,color)
'set line 'color''
'draw line 'px1' 'py1' 'px2' 'py2''
return
function DrawLbl(px,py,lbl,color,size,suff)
if(lbl!='')
* if(lbl!='EQ')
* lbl=lbl%suff
* endif
'set string 'color' c '_lthick' '_langle''
'set strsiz '_lsize''
if(_lfont!='')
'set font '_lfont''
say 'You have set font '_lfont''
endif
'draw string 'px' 'py' 'lbl''
endif
return
function GetPos(wx,wy)
'q w2xy 'wx' 'wy''
_pos.x=subwrd(result,3)
_pos.y=subwrd(result,6)
return
function GetNowPos(type,now,start2,end2)
if(type='b'|type='B')
nowpos.x=now
nowpos.y=start2
endif
if(type='t'|type='T')
nowpos.x=now
nowpos.y=end2
endif
if(type='l'|type='L')
nowpos.x=start2
nowpos.y=now
endif
if(type='r'|type='R')
nowpos.x=end2
nowpos.y=now
endif
GetPos(nowpos.x,nowpos.y)
return
function IsTargAxis(xtype,ytype,type,targ)
res = 0
if(xtype=targ & (type='B'|type='b'|type='T'|type='t'))
res = 1
endif
if(ytype=targ & (type='L'|type='l'|type='R'|type='r'))
res = 1
endif
return res
function TypeTran(dim)
res=''
if(dim='Lat');res='Y';return res;endif
if(dim='Lon');res='X';return res;endif
if(dim='Time');res='T';return res;endif
if(dim='Lev');res='Z';return res;endif
if(dim='Val');res='val';return res;endif
return 'E' |
|