/*GENERATE SAMPLE DATA SET TO DEMONSTRATE - THIS SET IS THE INPUT TO THE MACRO*/

/*THIS DATA STEP SHOULD BE REMOVED WHEN THE USER HAS AN EXISTING DATA SET     */

data a (drop=x);

 do x=1 to 40;

  y=round(ranuni(28573)*10,0.01);

  output;

 end;

run;

 

/*MACRO TO PRODUCE SPARKLINES*/

%macro sparkline (data_set, var_name, upper_limit, lower_limit, title_word, stype, minmax);

/*DATA_SET IS THE NAME OF THE DATA SET CONTAINING THE GRAPH DATA - ONE VARIABLE (COLUMN) SHOULD CONTAIN THE VALUES*/

/*VAR_NAME IS THE NAME OF THE VARIABLE THAT CONTAINS THE GRAPH DATA*/

/*UPPER_LIMIT IS THE NORMAL UPPER LIMIT - IF THE 75TH PERCENTILE IS TO BE USED, TYPE 75TH*/

/*LOWER_LIMIT IS THE NORMAL LOWER LIMIT - IF THE 25TH PERCENTILE IS TO BE USED, TYPE 25TH*/

/*TITLE_WORD IS THE ONE WORD TO BE USED TO THE RIGHT OF THE SPARKLINE - MUST BE 11 LETTERS OR FEWER*/

/*STYPE DETERMINES IF THE SPARKLINE SHOULD BE THE TREND LINE TYPE OR BAR TYPE*/

/*MINMAX DETERMINES IF THE MINIMUM AND MAXIMUM ARE MARKED WITH A COLORED DOT IN THE TREND TYPE – USE YES OR NO – LEAVE BLANK FOR BAR*/

 

proc means data=&data_set. noprint;

 var &var_name.;

output out=avg mean=avg p25=p25 p75=p75 min=min max=max; /*COMPUTE MEAN, 25TH AND 75TH PERCENTILES*/

run;

 

data _null_;

 set avg;

call symputx('avg',avg); /*CREATE A MACRO VARIABLE TO HOLD THE MEAN*/

call symputx('p25',p25); /*CREATE A MACRO VARIABLE TO HOLD THE 25TH PERCENTILE*/

call symputx('p75',p75); /*CREATE A MACRO VARIABLE TO HOLD THE 75TH PERCENTILE*/

call symputx('min',min); /*CREATE A MACRO VARIABLE TO HOLD THE MINIMUM*/

call symputx('max',max); /*CREATE A MACRO VARIABLE TO HOLD THE MAXIMUM*/

run;

 

data spark;

 set &data_set. end=last;

minmax="&minmax.";

if (minmax="YES" & &var_name.=&min.) then min=&min.;

if (minmax="YES" & &var_name.=&max.) then max=&max.;

u="&upper_limit.";

if u='75TH' then ul=&p75.; /*USE THE 75TH PERCENTILE OR GIVEN VALUE FOR THE UPPER LIMIT*/

 else ul="&upper_limit.";

l="&lower_limit.";

if l='25TH' then ll=&p25.; /*USE THE 25TH PERCENTILE OR GIVEN VALUE FOR THE UPPER LIMIT*/

 else ll="&lower_limit.";

x=_n_;   /*SET A VARIABLE TO USE AS THE VALUES FOR THE INDEPENDENT VARIABLE*/

z=&avg.; /*SET AN AVERAGE VARIABLE TO GRAPH THE AVERAGE LINE*/

if last then

 do;

  e=&var_name.;                        /*CREATE A NEW VARIABLE TO HOLD THE VALUE OF THE LAST DATA POINT*/

  call symputx('lastone',round(e,0.1));/*CREATE A MACRO VARIABLE TO HOLD A ROUNDED VERSION OF THE LAST DATA POINT*/

 end;

run;

 

/*CREATE AN ANNOTATE DATA SET TO CREATE THE GRAY RECTANGLE*/

data anno;

 set spark;

function='move'; xsys='1'; ysys='2';

                 x=3; y=ll;

                 output;

function='bar';  xsys='1'; ysys='2';

                 x=100; y=ul;

                 color='ligr'; style='solid';

                 line=0; when='b';

                 output;

run;

 

%let stype=%upcase(&stype.); /*IN CASE THE USER PUT STYPE IN LOWER CASE*/

 

 

%if &stype.=TREND %then

%do;

goptions noborder RESET=ALL hsize=6 vsize=1.7;

 

/*SET LENGTH OF X AXIS SO THAT THE ENTIRE RED DOT IS VISIBLE*/

axis1 length=88 pct;

 

/*SET THE PROPERTIES OF THE LINES USED TO DRAW THE GRAPHS*/

symbol1 color=ligr interpol=join value=none;

symbol2 color=ligr interpol=join value=none;

symbol3 color=black interpol=join value=none width=2;

symbol4 color=black interpol=join value=none;

symbol5 color=red interpol=none value=dot height=1.6;

symbol6 color=blue interpol=none value=dot height=1.6;

symbol7 color=green interpol=none value=dot height=1.6;

 

/*GRAPH THE REQUIRED LINES AND PUT THE TEXT TO THE RIGHT OF THE GRAPH*/

proc gplot data=spark;

 plot ll*x ul*x &var_name.*x z*x e*x min*x max*x / noaxis noframe overlay annotate=anno haxis=axis1;

 note move=(99 pct, 54 pct)  font="Arial" color=black height=4 "&title_word";

 note move=(145 pct, 54 pct)  font="Arial" color=red height=4 "&lastone.";

run;

quit;

%end;

 

%else

%do;

goptions reset=ALL hsize=6 vsize=1.7 colors=(black);

 

pattern value=solid;

 

/*GRAPH THE REQUIRED BARS AND PUT THE TEXT TO THE RIGHT OF THE GRAPH*/

proc gchart data=spark;

 vbar x / sumvar=y levels=all discrete noaxis noframe;

 note move=(102 pct, 54 pct)  font="Arial" color=black height=4 "&title_word";

 note move=(148 pct, 54 pct)  font="Arial" color=red height=4 "&lastone.";

run;

quit;

%end;

%mend sparkline;

 

 

/*RUN THE MACRO*/

%sparkline(a, y, 75TH, 25TH, temperature, TREND, YES)

%sparkline(a, y, 75TH, 25TH, temperature, BAR)