%macro picto(inds, vvar, tvar, units);
/* PROC SORT is used to make values go in */
/* ascending order. */
proc sort data=&inds;
by &vvar; /* by number of otters */
run;
/* Get information for the dimensions */
/* of the pictogram. */
proc means data=&inds noprint max;
var &vvar; /* number of otters */
output out=picsize(keep= nbars vmax)
max=vmax /* max. number of otters - width */
n=nbars; /* number of manuf. plants - height */
run;
/* DATA step which produces the pictogram */
data _null_;
/* Arrays are used to store x-coordinates */
/* for symbols. */
array pmx {18} px1-px18;
retain xmin xmax vmin vmax xlab
yaxmin yaxmax xrange yrange pmx
yaxlen ywidth ystart ybar ymargn
vscale nbars ncolors pmy;
/* Start the initialization part. */
if _n_ = 1 then do;
rc=ginit(); /* Initialize DSGI. */
rc=graph('clear'); /* Open the graph to */
/* receive primitives. */
set picsize; /* summary data set */
/* Set the colors for the symbols used */
/* in the pictogram. */
rc = gset('colrep', 1, 'gray10'); /* symbol color */
rc = gset('colrep', 2, 'gray30'); /* symbol color */
rc = gset('colrep', 3, 'gray50'); /* symbol color */
rc = gset('colrep', 4, 'gray70'); /* symbol color */
rc = gset('colrep', 5, 'gray90'); /* symbol color */
rc = gset('colrep', 6, 'grayb0'); /* symbol color */
rc = gset('colrep', 7, 'grayd0'); /* symbol color */
rc = gset('colrep', 8, 'black'); /* for text/ */
/* line color */
ncolors=7; /* seven colors for symbols */
/* Find out the dimensions of the */
/* default window. */
call gask('window', 0, x1, y1, x2, y2, rc);
xrange=x2-x1; /* width of graph area in */
/* window units */
yrange=y2-y1; /* height of graph area in */
/* window units */
/* Locate pictogram area dimensions. */
xlab = .23*xrange; /* x-coordinate for */
/* plant labels */
xmin = .25*xrange; /* min. x-dimension of pict. */
xmax = .95*xrange; /* max. x-dimension of pict. */
yaxmin = .15*yrange; /* min. y-dimension of pict. */
yaxmax = .95*yrange; /* max. y-dimension of pict. */
/* YAXLEN is the range in y of the graph area. */
/* YWIDTH is the room allowed in y for each */
/* symbol row. */
/* YMARGN is the room allowed in y between */
/* rows. */
yaxlen=yaxmax-yaxmin; /* y-axis length */
ywidth=floor(yaxlen/(nbars+1)); /* symbol height */
ymargn=(yaxlen-(ywidth*nbars))/(nbars-1);
/* room between rows */
/* Prepare minimum and maximum values. */
vmin=0; /* Include 0 in the data range. */
/* Adjust the max. value to add space at */
/* the end of the pict. area. */
vmax=(floor(vmax/10)+1) * 10;
/* Compute the ratio of screen percentage to */
/* data range. */
vscale=(xmax-xmin)/(vmax-vmin);
/* INCR is the space between symbols in */
/* the x-direction. */
incr=(xmax-xmin)/dim(pmx);
/* Calculate the x-coordinates */
/* for the symbols being drawn. */
do i=1 to dim(pmx);
pmx{i}=xmin+incr/2+((i-1)*incr);
end;
/* Calculate the value of each symbol. */
symvalue=(vmax-vmin)/dim(pmx);
/* Set time line attributes for the */
/* pictogram frame. */
rc=gset('lintype', 1); /* solid line */
rc=gset('linwidth', 3); /* width of 3 */
rc=gset('lincolor', 8); /* black */
/* Draw the frame --- x-values appear first, */
/* followed by y-values. */
rc=gdraw('line', 5, xmin, xmax, xmax, xmin, xmin,
yaxmin, yaxmin, yaxmax, yaxmax, yaxmin);
/* Set attributes for the legend text. */
rc=gset('texfont', 'swissl'); /* swissl font */
rc=gset('texcolor', 8); /* black */
rc=gset('texheight', 2.5); /* height of 2.5 */
rc=gset('texalign', 'center', 'top');
/* Center and justify the text and align based */
/* on the top of the text. */
/* Provide a legend for the pictogram. */
rc=gdraw('text', .5*xrange, .13*yrange,
'1 symbol = ' || left(put(symvalue, 6.2)) ||
%str(&units));
/* Begin at the top of the pictogram with the */
/* shortest row. */
ystart=yaxmax;
end; /* End the initialization part. */
set &inds end=last; /* Now read in the otter */
/* data set. */
ybar=ystart-ywidth; /* Get the y-coordinate for *
/* the symbols. */
pmy=(ybar+ystart)/2; /* Center text vertically */
/* in the row. */
/* Draw the label for the manufacturing plant. */
rc=gset('texcolor', 8); /* black */
rc=gset('texheight', 2.5); /* height of 2.5 */
rc=gset('texfont','swissl'); /* SWISSL font */
rc=gset('texalign','right','half'); /* right */
/* justify */
/* Align text vertically to midpoint. */
rc=gdraw('text', xlab, pmy, &tvar);
/* Convert the data value to an x-coordinate. */
xval=xmin+((&vvar-vmin)*vscale);
/* Set up the clipping viewport for the plant. */
/* Viewport coordinates are in a percentage */
/* from 0 to 1. */
rc=gset('viewport', 1, xmin/xrange, ybar/yrange,
xval/xrange, ystart/yrange);
/* Set up the scale for this viewport. */
rc=gset('window', 1, xmin, ybar, xval, ystart);
/* The VIEWPORT and WINDOW functions have no */
/* effect until this function is called. */
rc=gset('transno', 1); /* Activate */
/* transformation. */
rc=gset('clip', 'on'); /* Turn viewport */
/* clipping on. */
/* Set text attributes to draw a row */
/* of symbols. */
rc=gset('texfont', 'marker'); /* MARKER font */
rc=gset('texheight', 5); /* height of 5 */
rc=gset('texcolor', mod(_n_, ncolors) + 1);
/* Rotate through the colors listed for */
/* the symbols. */
rc=gset('texalign','center','half');
/* Center and justify the text. */
/* Align text midpoint to point. */
/* Draw the symbols. */
do i=1 to dim(pmx);
/* Draw text against the clipping viewport. */
/* V = star symbol */
rc=gdraw('text', pmx{i}, pmy, 'v');
end;
rc=gset('clip', 'off'); /* Turn clipping off. */
rc=gset('transno', 0); /* Return to default */
/* transformation. */
ystart=ybar-ymargn; /* Move down y-axis to the */
/* top of the next row. */
if last then do;
/* These two routines are done only */
/* at end-of-data-set. */
rc=graph('update'); /* Display the graph. */
rc=gterm(); /* Terminate DSGI. */
end;
run;
%mend picto;
data pctdata;
input otters plant $char20.;
cards;
116 Westchester
323 Riverside
239 Elm Grove
452 Pleasant Heights
337 Airport
399 Downtown
129 Gleneagle
533 Porterville
344 North Station
;
goptions border;
title f=swissl c=black h=3.5 pct
'Otters Completed by Our Subcontractors, 01Jun-30Jun';
%picto(pctdata, otters, plant, 'Otters');
title;