*
; /*------------------------------------------------------------------* * THIS MACRO CREATES AN ANNOTATE DATASET FOR PLOTTING A LINE ON A * * SURFACE GRAPH. YOU WOULD TYPICALLY USE THIS TO SHOW ACCUMULATED * * VALUES SHOWN AS A SURFACE GRAPH LYING UNDERNEATH A CHANGING * * VALUE LINE SUCH AS A TARGET OR MAXIMUM CAPACITY ETC. IT ALLOWS * * YOU TO MIX A SURFACE PLOT WITH A LINE PLOT JUST LIKE YOU CAN DO * * WITH GDDM. DO NOT FORGET TO SPECIFY THE ANNOTATE DATASETS YOU * * CREATE TO GPLOT USING THE ANNO= PARAMETER. * *------------------------------------------------------------------*/ /*-----------------------------------------------------------------* * DSN - NAME OF INPUT DATASET. * * XVAR - VARIABLE NAME OF X VARIABLE. * * YVAR - VARIABLE NAME OF Y VARIABLE. * * BYVAR - VARIABLE NAME OF BY VARIABLE. * * OUTDSN - NAME OF OUTPUT ANNOTATE DATASET. * * COLOR - COLOR FOR THE TEXT (NO QUOTES). RECOMMEND BLANK. * *-----------------------------------------------------------------*/ %MACRO MKLNANNO(DSN=,OUTDSN=ZZLNANNO,XVAR=,YVAR=,BYVAR=,COLOR=); DATA &OUTDSN; RETAIN FUNCTION 'DRAW' WHEN 'A' XSYS '2' YSYS '2'; LENGTH COLOR $ 1; SET &DSN(KEEP=&XVAR &YVAR &BYVAR); COLOR="&COLOR "; RENAME &XVAR=X &YVAR=Y ; PROC SORT DATA=&OUTDSN; BY &BYVAR X; DATA &OUTDSN(COMPRESS=NO); SET &OUTDSN(WHERE=(Y NE .)); %IF %QUOTE(&BYVAR) NE %THEN %DO; BY &BYVAR X; IF FIRST.&BYVAR THEN FUNCTION='MOVE'; %END; %ELSE %DO; IF _N_=1 THEN FUNCTION='MOVE'; %END; RUN; %MEND MKLNANNO; *Example; data one; do x=0 to 1 by atan(1)/4; y=cos((1-x)/(1+x)); output; end; run; %MKLNANNO(DSN=one,OUTDSN=two,XVAR=x,YVAR=y,BYVAR=,COLOR=red); symbol i=splinep; proc gplot data=one; plot y*x/ areas=1 annotate=two; run; *;