goptions reset=all target=pscolor ftext=swissb gunit=pct htext=2.5 rotate=landscape ctext=black; %let headlclr=red; /* color of the arrowhead outline */ %let headbord=2; /* thickness of the arrowhead outline in pixels*/ %let headwid=.03; /* scaling factor for calculating the width of the arrowhead based on the X data range */ %let headfclr=yellow; /* color of the interior of the arrow head */ %let headlen=.05; /* scaling factor for calculating the length of the arrowhead based on the Y data range */ %let tailclr=blue; /* color of the arrow tail */ %let tailsize=8; /* thickness of the arrow tail in pixels */ %let taillen=.30; /* scaling factor for calculating the length of the arrow tail based on the Y data range */ %let labelclr=green; /* color of the arrow label */ %let labelsiz=1.5; /* size of the arrow label in character cells */ %let labelfnt=centbi; /* font for the arrow label */ data inds; input transno balance date date7.; if _n_=1 then updown=-1; else do; if balance ge lag(balance) then updown=1; if balance lt lag(balance) then updown=-1; end; cards; 1 200 05mar95 2 433 14mar95 3 375 13apr95 4 500 18apr95 5 600 26jul95 6 750 17aug95 7 850 21sep95 8 456 12oct95 9 300 13dec95 10 550 20dec95 11 299 29dec95 ; run; proc means min max noprint data=inds; var transno balance; output out=xyrange min=minxvar minyvar max=maxxvar maxyvar; run; data xyrange; set xyrange; minxvar=minxvar - (.05 * abs(maxxvar)); maxxvar=maxxvar + (.05 * abs(maxxvar)); minyvar=minyvar - ((2 * &taillen) * abs(maxyvar)); maxyvar=maxyvar + ((2 * &taillen) * abs(maxyvar)); run; data preanno; if _n_=1 then set xyrange; set inds; run; data anno; set preanno; length function color style $ 8 text $ 10 position $1; retain xsys ysys '2'; **** draw the filled arrowhead ****; function='move'; when='a'; x=transno; y=balance; output; function='poly'; x=transno-(&headwid * abs(maxxvar)); y=balance+((&headlen * abs(maxyvar))) * updown; color="&headfclr"; style='msolid'; output; function='polycont'; x=transno+(&headwid * abs(maxxvar)); y=balance+((&headlen * abs(maxyvar)) * updown); output; function='polycont'; x=transno; y=balance; output; **** draw the arrowhead outline ****; function='move'; x=transno; y=balance; output; function='draw'; x=transno-(&headwid * abs(maxxvar)); y=balance+((&headlen * abs(maxyvar)) * updown); color="&headlclr"; size=&headbord; output; function='draw'; x=transno+(&headwid * abs(maxxvar)); y=balance+((&headlen * abs(maxyvar)) *updown); output; function='draw'; x=transno; y=balance; output; **** draw the arrow tail ****; function='move'; x=transno; y=balance; output; function='draw'; x=transno; y=balance+(&taillen * updown * (abs(maxyvar))); color="&tailclr"; size=&tailsize; when='b'; output; **** place date above or below the arrow ****; function='label'; when='a'; x=transno; y=balance+(&taillen * abs(maxyvar)* updown); text=put(date,date7.); size=&labelsiz; style="&labelfnt"; color="&labelclr"; if updown=1 then position='2'; else position='8'; output; run; title1 height=4 '1995 Account Summary'; proc gplot data=preanno anno=anno; format balance comma5.; plot balance * transno=1 maxyvar * maxxvar=2 minyvar * minxvar=2 / overlay haxis=axis1 vaxis=axis2; axis1 label=('Transaction Number') minor=none; axis2 label=(angle=90 rotate=0 'Account Balance (in dollars)'); symbol1 interpol=join value=dot color=green width=3 height=3; symbol2 interpol=none value=none; run; quit;