GrADS: Some useful prerequisite scripts - cbarn.gs

Save the below script as "cbarn.gs" in a text editor:


The script:

*

*  Script to plot a colorbar

*

*  The script will assume a colorbar is wanted even if there is 

*  not room -- it will plot on the side or the bottom if there is

*  room in either place, otherwise it will plot along the bottom and

*  overlay labels there if any.  This can be dealt with via 

*  the 'set parea' command.  In version 2 the default parea will

*  be changed, but we want to guarantee upward compatibility in

*  sub-releases.

*

*

* modifications by mike fiorino 940614

*

* - the extreme colors are plotted as triangles

* - the colors are boxed in white

* - input arguments in during a run execution:

* run cbarn sf vert xmid ymid

*

* sf   - scale the whole bar 1.0 = original 0.5 half the size, etc.

* vert - 0 FORCES a horizontal bar = 1 a vertical bar

* xmid - the x position on the virtual page the center the bar

* ymid - the x position on the virtual page the center the bar

*

* if vert,xmid,ymid are not specified, they are selected

* as in the original algorithm

*  


function colorbar (args)


sf=subwrd(args,1)

vert=subwrd(args,2)

xmid=subwrd(args,3)

ymid=subwrd(args,4)


if(sf='');sf=1.0;endif


*

*  Check shading information

*

  'query shades'

  shdinfo = result

  if (subwrd(shdinfo,1)='None') 

    say 'Cannot plot color bar: No shading information'

    return

  endif


*  Get plot size info

*

  'query gxinfo'

  rec2 = sublin(result,2)

  rec3 = sublin(result,3)

  rec4 = sublin(result,4)

  xsiz = subwrd(rec2,4)

  ysiz = subwrd(rec2,6)

  ylo = subwrd(rec4,4)

  xhi = subwrd(rec3,6)

  xd = xsiz - xhi


  ylolim=0.6*sf

  xdlim1=1.0*sf

  xdlim2=1.5*sf  

  barsf=0.8*sf

  yoffset=0.2*sf

  stroff=0.05*sf

  strxsiz=0.12*sf

  strysiz=0.13*sf

*

*  Decide if horizontal or vertical color bar

*  and set up constants.

*

  if (ylo<ylolim & xd<xdlim1) 

    say "Not enough room in plot for a colorbar"

    return

  endif

  cnum = subwrd(shdinfo,5)

*

* logic for setting the bar orientation with user overides

*

  if (ylo<ylolim | xd>xdlim1)

    vchk = 1

    if(vert = 0) ; vchk = 0 ; endif

  else

    vchk = 0

    if(vert = 1) ; vchk = 1 ; endif

  endif

*

* vertical bar

*


  if (vchk = 1 )


    if(xmid = '') ; xmid = xhi+xd/2 ; endif

    xwid = 0.2*sf

    ywid = 0.5*sf

    

    xl = xmid-xwid/2

    xr = xl + xwid

    if (ywid*cnum > ysiz*barsf) 

      ywid = ysiz*barsf/cnum

    endif

    if(ymid = '') ; ymid = ysiz/2 ; endif

    yb = ymid - ywid*cnum/2

    'set string 1 l 5'

    vert = 1


  else


*

* horizontal bar

*


    ywid = 0.4

    xwid = 0.8


    if(ymid = '') ; ymid = ylo/2-ywid/2 ; endif

    yt = ymid + yoffset

    yb = ymid

    if(xmid = '') ; xmid = xsiz/2 ; endif

    if (xwid*cnum > xsiz*barsf)

      xwid = xsiz*barsf/cnum

    endif

    xl = xmid - xwid*cnum/2

    'set string 1 tc 5'

    vert = 0

  endif



*

*  Plot colorbar

*



  'set strsiz 'strxsiz' 'strysiz

  num = 0

  while (num<cnum) 

    rec = sublin(shdinfo,num+2)

    col = subwrd(rec,1)

    hi = subwrd(rec,3)

    if (vert) 

      yt = yb + ywid

    else 

      xr = xl + xwid

    endif


*   Draw the left/bottom triangle

    if (num = 0)

      if(vert = 1)

        xm = (xl+xr)*0.5

        'set line 'col

        'draw polyf 'xl' 'yt' 'xm' 'yb' 'xr' 'yt' 'xl' 'yt

        'set line 1 1 5'

        'draw line 'xl' 'yt' 'xm' 'yb

        'draw line 'xm' 'yb' 'xr' 'yt

        'draw line 'xr' 'yt' 'xl' 'yt

      else

        ym = (yb+yt)*0.5

        'set line 'col

        'draw polyf 'xl' 'ym' 'xr' 'yb' 'xr' 'yt' 'xl' 'ym

        'set line 1 1 5'

        'draw line 'xl' 'ym' 'xr' 'yb

        'draw line 'xr' 'yb' 'xr' 'yt

        'draw line 'xr' 'yt' 'xl' 'ym

      endif

    endif


*   Draw the middle boxes

    if (num!=0 & num!= cnum-1)

      'set line 'col

      'draw recf 'xl' 'yb' 'xr' 'yt

      'set line 1 1 5'

      'draw rec  'xl' 'yb' 'xr' 'yt

    endif


*   Draw the right/top triangle

    if (num = cnum-1)

      if (vert = 1)

        'set line 'col

        'draw polyf 'xl' 'yb' 'xm' 'yt' 'xr' 'yb' 'xl' 'yb

        'set line 1 1 5'

        'draw line 'xl' 'yb' 'xm' 'yt

        'draw line 'xm' 'yt' 'xr' 'yb

        'draw line 'xr' 'yb' 'xl' 'yb

      else

        'set line 'col

        'draw polyf 'xr' 'ym' 'xl' 'yb' 'xl' 'yt' 'xr' 'ym

        'set line 1 1 5'

        'draw line 'xr' 'ym' 'xl' 'yb

        'draw line 'xl' 'yb' 'xl' 'yt

        'draw line 'xl' 'yt' 'xr' 'ym

      endif

    endif


*   Put numbers under each segment of the color key

    if (num < cnum-1)

      if (vert) 

        xp=xr+stroff

        'draw string 'xp' 'yt' 'hi

      else

        yp=yb-stroff

       'draw string 'xr' 'yp' 'hi

      endif

    endif


*   Reset variables for next loop execution

    if (vert) 

      yb = yt

    else

      xl = xr

    endif

    num = num + 1


  endwhile


return



Comments

Popular posts from this blog

ഇൻഡോർ: ഞാൻ താമസിച്ച ആദ്യ ഉത്തരേന്ത്യൻ സിറ്റിയും ഒരു എൻ.സി.സി. നാഷണൽ ക്യാമ്പും

GrADS: Some useful prerequisite scripts - basemap.gs

GrADS: How to draw a Hovmoller (or Hovmuller) diagram?