- 积分
- 3063
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2014-9-19
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
论坛上早已有前辈分享了一页多图统一出一个色标的gs,但它是矩形的。那么具体应该改哪些内容才能换成三角形式的呢?【之前有对比过清风的cbar_interp.gs和cbarn_interp.gs,但实际应用到这一个gs中还是无从下手,请教大家了!谢谢各位!】
xbar.gs如下:
*
* Help is in the end of this script.
*
function xcbar( args )
_version='0.07r3'
if( args = '' )
help()
* return
endif
***** Default value *****
xmin = 'none'
xmax = 'none'
ymin = 'none'
ymax = 'none'
direction = 'none'
cnum = -1
***** Arguement *****
* position
* xmin = subwrd( args, 1 )
* xmax = subwrd( args, 2 )
* ymin = subwrd( args, 3 )
* ymax = subwrd( args, 4 )
* temp = subwrd( args, 5 )
* if( valnum(temp) = 0 )
*** Usage 1 ***
* i = 5
i = 1
arg = 'dummy'
while( 1 )
arg = subwrd( args, i )
i = i + 1
if( arg = '' ); break; endif
while( 1 )
if( arg = '-direction' | arg = '-dir' )
direction = subwrd( args, i )
if( direction = 'h' ); direction = 'horizontal'; endif
if( direction = 'v' ); direction = 'vertical'; endif
i = i + 1
break
endif
if( arg = '-edge' )
edge = subwrd( args, i )
i = i + 1
break
endif
if( arg = '-fwidth' | arg = '-fw' )
fwidth = subwrd( args, i )
i = i + 1
break
endif
if( arg = '-fheight' | arg = '-fh' )
fheight = subwrd( args, i )
i = i + 1
break
endif
if( arg = '-fthickness' | arg = '-ft' )
fthickness = subwrd( args, i )
i = i + 1
break
endif
if( arg = '-fstep' | arg = '-fs' )
fstep = subwrd( args, i )
i = i + 1
break
endif
if( arg = '-foffset' | arg = '-fo' )
foffset = subwrd( args, i )
i = i + 1
break
endif
if( arg = '-fcolor' | arg = '-fc' )
fcolor = subwrd( args, i )
i = i + 1
break
endif
if( arg = '-line' )
line = subwrd( args, i )
i = i + 1
break
endif
if( arg = '-linecolor' | arg = '-lc' )
linecolor = subwrd( args, i )
i = i + 1
break
endif
if( arg = '-levcol' )
* color(1) level(1) color(2) level(2) ... level(cnum-1) color(cnum)
cnum = 1
while( 1 )
col.cnum = subwrd( args, i )
if( valnum(col.cnum) = 0 )
say 'Error in xcbar.gs: Syntax error in -levcol'
return
endif
i = i + 1
hi.cnum = subwrd( args, i )
if( valnum(hi.cnum) = 0 ); break; endif
cnum = cnum + 1
i = i + 1
endwhile
break
endif
if( valnum(arg) != 0 & xmin = 'none' )
xmin = arg
break
endif
if( valnum(arg) != 0 & xmax = 'none' )
xmax = arg
break
endif
if( valnum(arg) != 0 & ymin = 'none' )
ymin = arg
break
endif
if( valnum(arg) != 0 & ymax = 'none' )
ymax = arg
break
endif
say 'syntax error: 'arg
return
endwhile
endwhile
* else
*** Usage 2 ***
* font size
* fwidth = subwrd( args, 5 )
* fheight = subwrd( args, 6 )
* fstep = subwrd( args, 7 )
* foffset = subwrd( args, 8 )
* endif
*** get shade information ***
if( cnum = -1 )
'q shades'
shdinfo = result
if ( subwrd( shdinfo, 1 ) = 'None' )
say 'Error in xcbar.gs: No shading information'
return
endif
* number of colors
cnum = subwrd( shdinfo, 5 )
if( cnum <= 0 )
say 'Error in xcbar.gs: Number of color is zero'
return
endif
* color and (higher) levels
i = 1
while( i <= cnum )
rec = sublin( shdinfo, i+1 )
col.i = subwrd( rec, 1 )
hi.i = subwrd( rec, 3 )
i = i + 1
endwhile
endif
*** determine xmin, xmax, ymin, ymax if necessary ***
* ( following cbar.gs )
if( xmin = 'none' | xmax = 'none' | ymin = 'none' | ymax = 'none' )
'q gxinfo'
sline = sublin( result, 2 )
xsize = subwrd( sline, 4 )
ysize = subwrd( sline, 6 )
xline = sublin( result, 3 )
yline = sublin( result, 4 )
xlmin = subwrd( xline, 4 )
xlmax = subwrd( xline, 6 )
xlwid = xlmax - xlmin
ylmin = subwrd( yline, 4 )
ylmax = subwrd( yline, 6 )
ylwid = ylmax - ylmin
* vertical
if( ylmin < 0.6 | xsize-xlmax > 1.5 )
direction = 'vertical'
xmin = xlmax + ( xsize - xlmax ) / 2 - 0.4
xmax = xmin + 0.2
y1wid = 0.5
if ( y1wid * cnum > ysize * 0.8 )
y1wid = ysize * 0.8 / cnum
endif
ymin = ysize / 2 - y1wid * cnum / 2
ymax = ysize / 2 + y1wid * cnum / 2
* horizontal
else
direction = 'horizontal'
ymin = ylmin / 2
ymax = ymin + 0.2
x1wid = 0.8
if ( x1wid * cnum > xsize * 0.8 )
x1wid = xsize * 0.8 / cnum
endif
xmin = xsize / 2 - x1wid * cnum / 2
xmax = xsize / 2 + x1wid * cnum / 2
endif
endif
*** determine direction if necessary ***
if( direction != 'horizontal' & direction != 'vertical' )
if( xmax - xmin >= ymax - ymin )
direction = 'horizontal'
else
direction = 'vertical'
endif
endif
if( direction = 'horizontal' )
xdir = 1
ydir = 0
else
xdir = 0
ydir = 1
endif
*** other default value *****
if( edge != 'box' & edge != 'triangle' & edge != 'circle' )
edge = 'box'
endif
if( valnum(fwidth) = 0 )
fwidth = 0.12
endif
if( valnum(fheight) = 0 )
fheight = 0.13
endif
if( valnum(fthickness) = 0 )
fthickness = fheight * 40
endif
if( valnum(fstep) = 0 )
fstep = 1
endif
if( valnum(foffset) = 0 )
foffset = 0
* foffset = fstep - 1
endif
if( valnum(fcolor) = 0 )
fcolor = 1
endif
if( line != 'on' & line != 'off' )
line = 'off'
endif
if( valnum(linecolor) = 0 )
linecolor = 1
endif
*** get other constant ***
* width of color bar
xdif = xdir * (xmax-xmin) / cnum
ydif = ydir * (ymax-ymin) / cnum
* position of the fonts
xmoji = xmin + fwidth * ydir
ymoji = ymin - fheight * xdir
*** draw ***
i = 1
x1 = xmin - xdif
x2 = xmin * xdir + xmax * ydir
y1 = ymin - ydif
y2 = ymin * ydir + ymax * xdir
while( i <= cnum )
x1 = x1 + xdif
x2 = x2 + xdif
y1 = y1 + ydif
y2 = y2 + ydif
xmoji = x2 + ( 0.5 * fwidth ) * ydir
ymoji = ( y1 - 0.5 * fheight ) * xdir + y2 * ydir
* rec = sublin( shdinfo, i+1 )
* col = subwrd( rec, 1 )
* hi = subwrd( rec, 3 )
'set line 'col.i
'set strsiz 'fwidth' 'fheight
*** draw color bar ***
if( edge = 'box' )
'draw recf 'x1' 'y1' 'x2' 'y2
if( line = 'on' ) ; drawrec( linecolor, x1, y1, x2, y2 ) ; endif
endif
if( edge = 'triangle' )
if( i != 1 & i != cnum )
'draw recf 'x1' 'y1' 'x2' 'y2
if( line = 'on' ) ; drawrec( linecolor, x1, y1, x2, y2 ) ; endif
endif
if( direction = 'horizontal' )
if( i = 1 )
ymed = 0.5 * ( y1 + y2 )
poly = x1' 'ymed' 'x2' 'y1' 'x2' 'y2
'draw polyf 'poly
if( line = 'on' ) ; drawpoly( linecolor' 'poly ) ; endif
endif
if( i = cnum )
ymed = 0.5 * ( y1 + y2 )
poly = x1' 'y1' 'x1' 'y2' 'x2' 'ymed
'draw polyf 'poly
if( line = 'on' ) ; drawpoly( linecolor' 'poly ) ; endif
endif
endif
if( direction = 'vertical' )
if( i = 1 )
xmed = 0.5 * ( x1 + x2 )
poly = xmed' 'y1' 'x1' 'y2' 'x2' 'y2
'draw polyf 'poly
if( line = 'on' ) ; drawpoly( linecolor' 'poly ) ; endif
endif
if( i = cnum )
xmed = 0.5 * ( x1 + x2 )
poly = x1' 'y1' 'x2' 'y1' 'xmed' 'y2
'draw polyf 'poly
if( line = 'on' ) ; drawpoly( linecolor' 'poly ) ; endif
endif
endif
endif
* end of triangle
if( edge = 'circle' )
if( i != 1 & i != cnum )
'draw recf 'x1' 'y1' 'x2' 'y2
if( line = 'on' ) ; drawrec( linecolor, x1, y1, x2, y2 ) ; endif
endif
if( direction = 'horizontal' )
if( i = 1 )
xc = x1 + ( y2 - y1 )
yc = y1 + 0.5 * ( y2 - y1 )
radius = 0.5 * ( y2 - y1 )
'draw recf 'xc' 'y1' 'x2' 'y2
* say x1 % ' ' % x2 % ' ' % y1 % ' ' % y2
*say 'draw recf 'xc' 'y1' 'x2' 'y2
*exit
circle = circle( xc, yc, radius, 90, 270, 6 )
'draw polyf 'circle
if( line = 'on' ) ; drawpoly( linecolor' 'x2' 'y2' 'circle' 'x2' 'y1 ) ; endif
endif
if( i = cnum )
xc = x2 - ( y2 - y1 )
yc = y1 + 0.5 * ( y2 - y1 )
radius = 0.5 * ( y2 - y1 )
'draw recf 'x1' 'y1' 'xc' 'y2
circle = circle( xc, yc, radius, 270, 450, 6 )
'draw polyf 'circle
if( line = 'on' ) ; drawpoly( linecolor' 'x1' 'y1' 'circle' 'x1' 'y2) ; endif
endif
endif
if( direction = 'vertical' )
if( i = 1 )
xc = x1 + 0.5 * ( x2 - x1 )
yc = y1 + 0.5 * ( x2 - x1 )
radius = 0.5 * ( x2 - x1 )
'draw recf 'x1' 'yc' 'x2' 'y2
circle = circle( xc, yc, radius, 180, 360, 6 )
'draw polyf 'circle
if( line = 'on' ) ; drawpoly( linecolor' 'x1' 'y2' 'circle' 'x2' 'y2 ) ; endif
endif
if( i = cnum )
xc = x1 + 0.5 * ( x2 - x1 )
yc = y2 - 0.5 * ( x2 - x1 )
radius = 0.5 * ( x2 - x1 )
'draw recf 'x1' 'y1' 'x2' 'yc
circle = circle( xc, yc, radius, 0, 180, 6 )
'draw polyf 'circle
if( line = 'on' ) ; drawpoly( linecolor' 'x2' 'y1' 'circle' 'x1' 'y1 ) ; endif
endif
endif
endif
* end of circle
* draw labels
* if( i != cnum & i-math_int(i/fstep)*fstep = foffset)
if( i != cnum & i-foffset > 0 & math_int((i-1-foffset)/fstep)*fstep = i-1-foffset )
if( direction = 'horizontal' )
'set string 'fcolor' tc 'fthickness' 0'
else
'set string 'fcolor' l 'fthickness' 0'
endif
'draw string 'xmoji' 'ymoji' 'hi.i
endif
i = i + 1
endwhile
return
*
* angle = 0 : x(+) direction
* angle = 90 : y(+) direction
*
function circle( xc, yc, radius, amin, amax, astep )
circle=''
angle = amin
while( angle <= amax )
x = xc + radius * math_cos( angle * 3.14 / 180.0 )
y = yc + radius * math_sin( angle * 3.14 / 180.0 )
circle = circle % x % ' ' % y % ' '
angle = angle + astep
endwhile
return ( circle )
function drawrec( linecolor, xmin, ymin, xmax, ymax )
drawpoly( linecolor' 'xmin' 'ymin' 'xmin' 'ymax' 'xmax' 'ymax' 'xmax' 'ymin )
return
function drawpoly( args )
linecolor = subwrd( args, 1 )
xstart = subwrd( args, 2 )
ystart = subwrd( args, 3 )
xmin = xstart
ymin = ystart
i = 4
while( 1 = 1 )
xmax = subwrd( args, i )
ymax = subwrd( args, i+1 )
if( xmax = "" | ymax = "" ); break; endif
'set cthick 1'
'set line 'linecolor
'draw line 'xmin' 'ymin' 'xmax' 'ymax
xmin = xmax
ymin = ymax
i = i + 2
endwhile
'set cthick 1'
'set line 'linecolor
'draw line 'xmin' 'ymin' 'xstart' 'ystart
return
*
* help
*
function help()
say ' Name:'
say ' xcbar '_version' - Draw color bar at any position and size'
say ' '
say ' Usage:'
say ' xcbar [ xmin xmax ymin ymax ]'
say ' [ ( -fwidth | -fw ) value ]'
say ' [ ( -fheight | -fh ) value ]'
say ' [ ( -fthickness | -ft ) value ]'
say ' [ ( -fstep | -fs ) value ]'
say ' [ ( -foffset | -fo ) value ]'
say ' [ ( -fcolor | -fc ) value ]'
say ' [ ( -direction | -dir ) ( horizontal | h | vertical | v ) ]'
say ' [ -edge ( box | triangle | circle ) ]'
say ' [ -line ( on | off) ]'
say ' [ -levcol c(1) l(1) c(2) level(2) ... l(cnum-1) c(cnum) ]'
say ''
say ' xmin : color bar position (left side)'
say ' xmax : color bar position (right side)'
say ' ymin : color bar position (bottom side)'
say ' ymax : color bar position (top side)'
say ' without xmin, xmax, ymin or ymax, '
say ' position will be determined automatically'
say ' following cbar.gs manner.'
say ' fwidth : font width (default=0.12)'
say ' fw : same as fwidth'
say ' fheight : font height (default=0.13)'
say ' fh : same as fheight'
say ' fthickness : font thickness (default=fheight*40)'
say ' ft : same as fthickness'
say ' fstep : label step (default=1)'
say ' fs : same as fstep'
say ' foffset : label offset for fstep (default=0)'
say ' fo : same as foffset'
say ' fcolor : label color number (default=1)'
say ' fc : same as fcolor'
say ' direction : horizontal ("h" in short) or vertical ("v" in short)'
say ' color bar (default=horizontal)'
say ' dir : same as direction'
say ' edge : shape of edge (default=box)'
say ' line : lines between each color box (default=off)'
say ' linecolor : color of lines between each color box (default=1)'
say ' lc : same as linecolor'
say ' c(1) l(1) c(2) level(2) ... l(cnum-1) c(cnum)'
say ' : color numbers and levels. By using this option,'
say ' you can draw color bar without drawing figure'
say ''
say ' Note:'
say ' [arg-name] : specify if needed'
say ' (arg1 | arg2) : arg1 or arg2 must be specified'
say ''
say ' xcbar is based on cbar.gs'
say ''
say ' Copyright (C) 2011 Chihiro Kodama'
say ' Distributed under GNU GPL (http://www.gnu.org/licenses/gpl.html)'
say ''
return
|
|