goptions reset=all device=ps300 lfactor=5
gunit=pct htext=2.5 vsize=4.375 in hsize=6.75 in
ftext=swissb nodisplay;
proc greplay nofs igout=work.gseg; delete _all_; run; quit;
/* Input DATA step */
data psitest(drop=minpsi maxpsi days) summary(keep=maxpsi vendor days);
input @1 vendor $ @3 installd date7. @11 removed date7. @19 minpsi @23 maxpsi;
format installd removed date date7.;
length psicolor pattern $8;
/* Assign sequential test number and calculate test duration */
test=_n_;
days=intck('day',installd,removed);
output summary;
/* Create macro variable containing first test date */
if _n_=1 then call symput('stdate',put(installd,date7.));
/* Assign color and pattern values and create macro variables */
if vendor='A' then pattern='m1n45';
else if vendor='B' then pattern='m1x45';
else if vendor='C' then pattern='m1n135';
if (maxpsi lt 200) then psicolor='red';
else if ( 200 le maxpsi lt 300) then psicolor='yellow';
else if (maxpsi ge 300) then psicolor='green';
call symput('pat'||left(test),pattern);
call symput('color'||left(test),psicolor);
/* define polygon */
date=installd; psi=minpsi; output psitest;
psi=maxpsi; output psitest;
date=removed; output psitest;
psi=minpsi; output psitest;
date=installd; output psitest;
cards;
A 01jan95 07jan95 95 195
B 07jan95 20jan95 50 435
C 20jan95 25jan95 100 210
A 25jan95 02feb95 135 265
B 02feb95 15feb95 175 425
C 15feb95 23feb95 75 205
A 23feb95 28feb95 125 360
B 28feb95 10mar95 85 375
C 10mar95 17mar95 125 195
A 17mar95 20mar95 105 210
B 20mar95 25mar95 220 440
C 25mar95 01apr95 45 175
;
run;
/* Compile Annotate macros */
%annomac;
/* Create Annotate data set */
data anno;
set psitest end=eof;
by test;
/* Set lengths and type for Annotate variables */
%dclanno;
length text $10;
/* If first observation in the data set, label the first date on the
horizontal axis. */
if _n_=1 then do;
%system(2,1,3);
%move("&stdate"d,0);
%cntl2txt;
%system(2,9,3);
%label("&stdate"d,-2.5,upcase(trim(left("&stdate"))),black,45,0,2,swissb,4);
end;
/* If last observation for each polygon, label the removal date on the
horizontal axis. */
if last.test then do;
%system(2,1,3);
%move(removed,0);
%cntl2txt;
%system(2,9,3);
%label(removed,-2.5,trim(left(put(removed,date7.))),black,45,0,2,swissb,4);
end;
if eof then do;
/* Create macro variables containing the total number of samples
and the last test date */
call symput('total',test);
call symput('enddate',put(removed,date7.));
/* draw PSI legend */
%system(3,3,3);
%label(20,4,'MAX PSI:',black,0,0,2,swissb,<);
%bar(25,2,35,6,red,0,solid);
%cntl2txt;
%system(9,3,3);
%label(2,4,'0 - 200',black,0,0,2,swissb,>);
%system(3,3,3);
%bar(50,2,60,6,yellow,0,solid);
%cntl2txt;
%system(9,3,3);
%label(2,4,'200 - 300',black,0,0,2,swissb,>);
%system(3,3,3);
%bar(75,2,85,6,green,0,solid);
%cntl2txt;
%system(9,3,3);
%label(2,4,'> 300',black,0,0,2,swissb,>);
/* draw VENDOR legend */
%system(3,3,3);
%label(20,10,'VENDOR:',black,0,0,2,swissb,<);
%bar(25,8,35,12,*,0,R1);
%cntl2txt;
%system(9,3,3);
%label(2,10,'A',*,0,0,2,swissb,>);
%system(3,3,3);
%bar(50,8,60,12,*,0,X1);
%cntl2txt;
%system(9,3,3);
%label(2,10,'B',*,0,0,2,swissb,>);
%system(3,3,3);
%bar(75,8,85,12,*,0,L1);
%cntl2txt;
%system(9,3,3);
%label(2,10,'C',*,0,0,2,swissb,>);
end;
run;
/* Define macro to specify solid-filled map/plot interpolations */
%macro barcolor;
%do i=1 %to &total;
SYMBOL&i INTERPOL=MSOLID COLOR=&&color&i VALUE=NONE;
%end;
%mend;
/* Define macro to specify patterned map/plot interpolations */
%macro barpatrn;
%do i=1 %to &total;
%let j=%eval(&i+&total);
SYMBOL&j INTERPOL=&&pat&i COLOR=BLACK VALUE=NONE;
%end;
%mend;
/* Invoke the macros */
%barcolor;
%barpatrn;
proc gplot data=psitest;
title1 h=4 'Pressure Test for Valve #3162';
axis1 order="&stdate"d to "&enddate"d by day minor=none offset=(2,2) value=none
label=none;
axis2 offset=(0,0) label=(a=90 r=0 "Pressure (psi)") origin=(10,);
axis3 offset=(0,0) label=none value=(j=l);
plot psi*date=test / haxis=axis1 /* plot solid-colored polygons */
vaxis=axis2
nolegend /* suppress the legend on the plot */
frame /* draw a frame around the axis area */
vzero /* start the vertical axis with a value of 0 */
vref=200 300 /* draw reference lines */
anno=anno; /* specify the Annotate data set to apply */
plot2 psi*date=test / haxis=axis1 /* plot patterned polygons */
vaxis=axis3
nolegend
vzero;
/* Add FOOTNOTE to provide blank space at bottom of graph */
footnote1 h=18 ' ';
run;
quit;
/* Sort the SUMMARY data set */
proc sort data=summary;
by vendor;
/* Calculate average test duration and maximum pressure for each vendor */
proc means data=summary mean noprint;
var days maxpsi;
by vendor;
output out=vstats mean=avedays avemax;
run;
/* Prepare data for summary chart */
data vstats(keep=i avemax vendor tot) fmtdata(keep=fmtname start label type);
set vstats end=eof;
length psicolor $8 label $20;
/* Assign counter variable */
count=_n_;
/* Round the average number of days to the nearest 1/2 day */
tot=round(avedays,.5);
/* Create variables to use with CNTLIN= data set with PROC FORMAT */
fmtname='vfmt'; /* Identifies the format name */
type='c'; /* Format type will be Character */
start=vendor; /* Variable to be formatted is VENDOR */
label=trim(vendor)||': AVE '||trim(left(put(tot,5.1)))||' DAYS'; /* Formatted value */
output fmtdata;
/* Assign color values and create macro variables */
if (avemax lt 200) then psicolor='red';
else if ( 200 le avemax lt 300) then psicolor='yellow';
else if (avemax ge 300) then psicolor='green';
call symput('col'||left(count),psicolor);
/* Output multiple observations based on value
of variable TOT */
do i = .5 to tot by .5;
output vstats;
end;
if eof then do;
/* Create macro variable containing total number of vendors */
call symput('totv',count);
end;
run;
/* Use the CNTLIN= option with the FORMAT procedure to
create data-dependent formatted values for each VENDOR code */
proc format cntlin=fmtdata;
run;
/* Reset global graphics options before producing second chart */
goptions reset=global;
/* Define macro to specify solid bar patterns with data-dependent color */
%macro vpats;
%do i=1 %to &totv;
PATTERN&i V=SOLID C=&&col&i;
%end;
%mend;
/* Invoke the VPATS macro */
%vpats;
/* Produce summary chart */
proc gchart data=vstats;
vbar i / discrete
sumvar=avemax
group=vendor
space=0
ref=200 300 /* draw reference lines */
clipref /* clip the reference lines behind the bars */
nozeros
maxis=axis1
raxis=axis2
gaxis=axis3
patternid=group /* apply pattern by GROUP value */
frame;
axis1 value=none label=none offset=(2,2);
axis2 label=(a=90 r=0 'Average Maximum Pressure (psi)') origin=(15,) offset=(0,0);
axis3 label=none value=(h=2) length=75;
format vendor $vfmt.;
run;
quit;
/* Specify graphics options before combining graphs */
goptions device=xcolor target=ps300 display vsize=8.75 in;
/* Define template and combine graphs together on one page */
proc greplay nofs igout=work.gseg tc=work.templt;
tdef v2
1 / llx=0 lly=50 ulx=0 uly=100 urx=100 ury=100 lrx=100 lry=50
2 / llx=0 lly=0 ulx=0 uly=50 urx=100 ury=50 lrx=100 lry=0;
template v2;
tplay 1:gplot 2:gchart;
run;
quit;