/* 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;   /* Define Vertex 1               */
   psi=maxpsi; output psitest;   /* Define Vertex 2               */
   date=removed; output psitest; /* Define Vertex 3               */
   psi=minpsi; output psitest;   /* Define Vertex 4               */
   date=installd; output psitest;/* Define Vertex 5               */

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. All annotated text uses the */
      /* Helvetica-Bold PostScript hardware font (HWPSL011).      */
   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,hwpsl011,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,hwpsl011,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,hwpsl011,<);

%bar(25,2,35,6,red,0,solid);
%cntl2txt;
%system(9,3,3);
%label(2,4,'0 - 200',black,0,0,2,hwpsl011,>);

%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,hwpsl011,>);

%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,hwpsl011,>);

   /* Draw VENDOR legend.                                         */
%system(3,3,3);
%label(20,10,'VENDOR:',black,0,0,2,hwpsl011,<);

%bar(25,8,35,12,*,0,R1);
%cntl2txt;
%system(9,3,3);
%label(2,10,'A',*,0,0,2,hwpsl011,>);

%system(3,3,3);
%bar(50,8,60,12,*,0,X1);
%cntl2txt;
%system(9,3,3);
%label(2,10,'B',*,0,0,2,hwpsl011,>);

%system(3,3,3);
%bar(75,8,85,12,*,0,L1);
%cntl2txt;
%system(9,3,3);
%label(2,10,'C',*,0,0,2,hwpsl011,>);
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;
________________________________________________________________________

   /* Specify graphics options.                                   */
goptions device=pscolor ftext=hwpsl011
         gunit=pct htext=2.5 vsize=5 in
         nodisplay;


   /* Produce the first graph.                                    */
proc gplot data=psitest;
   title1 height=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=(angle=90 rotate=0 "Pressure (psi)")
         origin=(10,);
   axis3 offset=(0,0) label=none value=(justify=l);
                       /* Plot solid-colored polygons.            */
   plot psi*date=test  / haxis=axis1
                         vaxis=axis2
                       /* Suppress the legend on the plot.        */
                         nolegend
                       /* Draw a frame around the axis area.      */
                         frame
             /* Start the vertical axis with a value of 0.        */
                         vzero
             /* Draw reference lines.                             */
                         vref=200 300
             /* Specify the Annotate data set to apply.           */
                         anno=anno;
             /* Plot patterned polygons.                          */
   plot2 psi*date=test / haxis=axis1
                      vaxis=axis3
                      nolegend
                      vzero;

   /* Add FOOTNOTE to provide blank space at bottom of graph,     */
   /* with a height of 18% of the graphics output area.           */
footnote1 height=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 $16;

      /* 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.         */
      /* Formatted value.                                         */
   label=trim(vendor)||': AVE '
                     ||trim(left(put(tot,5.1)))||' DAYS';
   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 VALUE=SOLID COLOR=&&col&i;
   %end;
%mend;

   /* Invoke the VPATS macro.                                     */
%vpats;

_________________________________________________________________________

   /* Produce summary chart.                                      */
proc gchart data=vstats;
   vbar i / discrete
            sumvar=avemax
              /* Group the bars by the variable VENDOR.           */
            group=vendor
              /* Remove space between bars.                       */
            space=0                                                            /* Draw reference lines.                            */
            ref=200 300
              /* Clip the reference lines behind the bars.        */
            clipref
              /* Suppress bars with 0 response value.             */
            nozeros                                                            /* Modify axes attributes.                          */
            maxis=axis1
            raxis=axis2
            gaxis=axis3
               /* Apply pattern by GROUP value.                   */
            patternid=group
               /* Place a frame around the axis area.             */
            frame;
   axis1 value=none label=none offset=(2,2);
   axis2 label=(angle=90 rotate=0
         'Average Maximum Pressure (psi)')
         origin=(15,) offset=(0,0);
   axis3 label=none value=(height=2) length=75;
   format vendor $vfmt.;
run;
quit;

_________________________________________________________________________

 /* Specify graphics options before combining graphs.             */
goptions vsize=0 display;

   /* Combine graphs together on one page.                        */
proc greplay nofs igout=work.gseg tc=sashelp.templt;
   template v2;
   tplay 1:gplot 2:gchart;
run;
quit;