setting "clevs" in a script....

Eric Salathé salathe at WASHINGTON.EDU
Thu May 3 15:14:57 EDT 2007


On May 3, 2007, at 10:33 AM, Goodson,Ron [Edm] wrote:
> The recent question regarding settings clev reminded me that I was
> going
> to send out this bit of scripting, should anybody want it.



Along these lines, I have a few scripts that I can't live without
anymore either. The first (blueredblack) makes a color table that
runs black-blue-white-red-black. You call it with, for example,
"blueredblack 51" to create 51 color gradations (a negative value
will reverse the table). I've written similar scripts for other color
tables.

The second one I use to set contour levels. You call it as "clv x0 dx
xn" where x0 is the lowest level, xn the highest, and dx the
interval. Eg, "clv 0 2 100" will create 51 contour levels from 0 to
100 with an interval of 2 (0 2 4 6...100).

The last piece is to make a color bar that does not label all the
contour values. This is just a modified cbarn.gs to allow skipping
levels. If you call "cbarn 5" with the above clv call, you'll get
colorbar labels at 0 10 20 ... 100.

Using these together, you can make attractive maps with very smooth
color gradients like these
<http://www.atmos.washington.edu/~salathe/reg_climate_mod/ECHAM-MM5/
seadiffs/pcpabs_son.html>

-Eric

--
Eric Salathé
CSES Climate Impacts Group
<salathe at washington.edu>
University of Washington          <http://www.atmos.washington.edu/
~salathe>
206-616-5351


************* blueredblack ******************

function blueredblack(arg)

if (arg<0)
nx = -1*arg
dir = -1
else
nx = arg
dir = 1
endif

nx4 = nx/4

ix = 0
rbcols = ''

** black to blue

g=0
b=0
r=0

x=0

while (ix<=nx4)

colix = ix+20
'set rgb '%colix' 'r' 'g' 'b

if (dir>0)
rbcols = rbcols%' '%colix
else
rbcols = colix%' '%rbcols
endif

x = x + 1/nx4
y = x

ix = ix+1
r = 0
g = 0
b = 255*y

endwhile


** blue to white

g=0
b=255
r=0

x=1

while (ix<=2*nx4)

x = x - 1/nx4
y = x*x

colix = ix+20
'set rgb '%colix' 'r' 'g' 'b

if (dir>0)
rbcols = rbcols%' '%colix
else
rbcols = colix%' '%rbcols
endif

ix = ix+1
r = 255*(1-y)
g = 255*(1-y)
b = b

endwhile


** white to red

r=255
g=255
b=255

x = 0

while (ix<=3*nx4)

x = x + 1/nx4
y = x*x

colix = ix+20
'set rgb '%colix' 'r' 'g' 'b

if (dir>0)
rbcols = rbcols%' '%colix
else
rbcols = colix%' '%rbcols
endif

ix = ix+1
r = r
g = 255*(1-y)
b = 255*(1-y)

endwhile

** red to black

r=255
g=0
b=0

x = 1

while (ix<=nx)

x = x - 1/nx4
y = x

colix = ix+20
'set rgb '%colix' 'r' 'g' 'b

if (dir>0)
rbcols = rbcols%' '%colix
else
rbcols = colix%' '%rbcols
endif

ix = ix+1
r = 255*y
g = 0
b = 0

endwhile

'set rbcols '%rbcols


******************** clv ***********************
function clv(arg)

c1 = subwrd(arg, 1)
c2 = subwrd(arg, 3)
dc = subwrd(arg, 2)

c = c1

clevs = ''

while (c<=c2)
   clevs = clevs%' '%c
   c = c + dc
endwhile

'set clevs '%clevs


*
*  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 skip 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
*       skip - intervals to skip in numeric label
*
*       if vert,xmid,ymid are not specified, they are selected
*       as in the original algorithm
*

function colorbar (args)

skip=subwrd(args,1)
sf=subwrd(args,2)
vert=subwrd(args,3)
xmid=subwrd(args,4)
ymid=subwrd(args,5)

if(skip='');skip=1;endif
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
   nskp = 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

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

     'set line 'col
     'draw recf 'xl' 'yb' 'xr' 'yt

     'set line 1 1 3'

      if (vert)
* draw sides
       'draw line 'xl' 'yb' 'xl' 'yt
       'draw line 'xr' 'yb' 'xr' 'yt
      else
* draw top/bot
       'draw line 'xl' 'yb' 'xr' 'yb
       'draw line 'xl' 'yt' 'xr' 'yt
      endif
     endif

     if(num = 0 )
* low end
       if(vert = 1)
* draw bottom triangle (low)
         xm=(xl+xr)*0.5

         'set line 'col
         'draw polyf 'xl' 'yt' 'xm' 'yb' 'xr' 'yt' 'xl' 'yt

         'set line 1 1 3'
         'draw line 'xl' 'yt' 'xm' 'yb
         'draw line 'xm' 'yb' 'xr' 'yt
       else
* draw right side triangle (low)
         ym=(yb+yt)*0.5

         'set line 'col
         'draw polyf 'xl' 'ym' 'xr' 'yb' 'xr' 'yt' 'xl' 'ym

         'set line 1 1 3'
         'draw line 'xl' 'ym' 'xr' 'yb
         'draw line 'xr' 'yt' 'xl' 'ym

         if (nskp=0)
           'draw line 'xr' 'yb' 'xr' 'yt
         endif

       endif

     endif

     if(num = cnum-1 )
* high end
       if( vert = 1)
* draw top triangle
         'set line 'col
         'draw polyf 'xl' 'yb' 'xm' 'yt' 'xr' 'yb' 'xl' 'yb

         'set line 1 1 3'
         'draw line 'xl' 'yb' 'xm' 'yt
         'draw line 'xm' 'yt' 'xr' 'yb
       else
* draw bottom triangle
         'set line 'col
         'draw polyf 'xr' 'ym' 'xl' 'yb' 'xl' 'yt' 'xr' 'ym

         'set line 1 1 3'
         'draw line 'xr' 'ym' 'xl' 'yb
         'draw line 'xl' 'yt' 'xr' 'ym
       endif

     endif

     if (num<cnum-1)
       if (vert)
         xp=xr+stroff
         if (nskp=0)
           'draw string 'xp' 'yt' 'hi
         endif
       else
         yp=yb-stroff
         if (nskp=0)
           'draw string 'xr' 'yp' 'hi
         endif
       endif
     endif

     num = num + 1
     nskp = nskp+1
     if(nskp=skip); nskp=0; endif;
     if (vert); yb = yt;
     else; xl = xr; endif;
   endwhile
return



More information about the gradsusr mailing list