--- %%NOBANNER%% -->
/*------------------<--- Start of Description -->--------------------\
| Produce Gplot of continuous var(y-axis) vs a group var(x-axis) in |
| such a way that no points are hidden. Two types of plots may be |
| requested as shown below: |
| Left Justifed Centered |
| | . . | . . |
| | .. . | . . . |
| y | ... .... y | ... .. .. |
| | . .. | . . . |
| | . . | . . |
| | | |
| |------|-------|------- |----|-------|----- |
| level 1 level 2 level 1 level 2 |
| Group Group |
| This type of plot is most effective when N is not large and |
| you wish to display all of the data points. |
|--------------------<--- End of Description -->---------------------|
|--------------------------------------------------------------------|
|--------------<--- Start of Files or Arguments Needed -->-----------|
| Parameter definitions: |
| Note: If the macro variable values contain special characters, |
| e.g. ";)(,=" , you must use the %str(value) function to |
| avoid processing errors. |
| - Required parameters: |
| data=name of input sas data set |
| y=variable name for y-var |
| group=variable name for group-var(x). Macro assumes the group |
| var has a maximum of 9 levels. |
| x00, |
| x10,..., |
| x90=group-var levels to be plotted at positions 00-90 on |
| the x-axis, which is defined as numeric running from 0-100.|
| Do not use position x00 with a centered plot(see below). |
| You need define only the positions that will be needed |
| for your plot. For example, if the group-var was named |
| "grade" with 3-levels such as "normal,mild", "mod" and |
| "severe" then specifying: |
| x20=%str(normal,mild) |
| x50=mod, |
| x80=severe, |
| with group=grade would yield a well balanced plot. |
| - Optional: |
| justify= l for left-justifed plot(the default), c for centered.|
| space=horizontal distance between points with the same y-value.|
| The default value is 1, which allows up to 10 tied points|
| to be displayed if groups were plotted at x=10,20, etc. |
| Values from 0.5 to 2.0 seem to produce reasonable |
| results. |
| sym=plotting symbol to use in the SYMBOL statement. Choices |
| are listed in Table 16.1 of the SAS/Graph(V6) manual |
| (Vol. 1, p.421). Default is the dot symbol. |
| ht=plot symbol height to use in the SYMBOL statement. Choices |
| are listed on page 410 of the SAS/Graph(V6) manual. |
| Default value is .1cm. |
| yaxis=vaxis, vref and vminor options from PROC GPLOT. These |
| options will almost always have to be specified using the|
| %str(value) function. For example: |
| yaxis=%str(vaxis=10 to 20 by 1 vref=15 vminor=1). |
| Do NOT change the haxis settings. |
| glabel=label for group-var. Note that any existing label for the|
| group-var is not available to jitplot. |
| mn_md=M if you want the median y-value noted on the plot. Use |
| mn_md=X if you want the mean y-value and mn_md=B if you |
| want both the mean and the median. Default is not to |
| print either statistic. |
| outdata= name of output dataset containing jittered values |
|---------------<--- End of Files or Arguments Needed -->------------|
|--------------------------------------------------------------------|
|----------------<--- Start of Example and Usage -->-----------------|
| Example: |
| data one; |
| y=2; x='';x2=.; output; output;output; |
| y=4;x='b';x2=2; output; output; output; |
| y=1; x='a';x2=1; output; output; output; |
| proc print; |
| proc freq; tables x/out=ch ; |
| proc contents data=ch; |
| proc print; |
| run; |
| %jitplot(data=one,y=y,x40=a,x60=b,group=x,mn_md=x,outdata=xxx); |
| Usage: %jitplot(data=, y=, group=, x00=, x10=, x20=, x30=, |
| x40=, x50=, x60=, x70=, x80=, x90=,justify=l, |
| space=1, sym=dot, ht=.1cm, yaxis=, glabel=, |
| mn_md=n,outdata=); |
\-------------------<--- End of Example and Usage -->---------------*/
%macro jitplot(data=, y=, group=, x00=, x10=, x20=, x30=, x40=, x50=,
x60=, x70=, x80=, x90=, justify=l, space=1, sym=dot,
ht=.1cm, yaxis=, glabel=, mn_md=n,outdata=);
/*--------------------------------------------\
| Author: E. Bergstralh; |
| Created: February 9, 1993; |
| Modified: April 20, 1995; |
| Purpose: Produce Gplot of continuous |
| var(y-axis) vs a group var(x-axis)|
| in such a way that no points are |
| hidden; |
\--------------------------------------------*/
data _wk; set &data;
keep &group &y;
proc freq data=_wk; tables &group*&y/noprint out=_p1;
proc sort data=_wk; by &group;
proc univariate data=_wk noprint; by &group; var &y;
output out=_mnmd mean=mn median=md;
data _p2; set _p1 _mnmd; by &group;
**convert group var levels to numeric 00=>90;
if &group="" then delete; **delete "missing" group levels;
if &group="&x00" then gp= 0;
if &group="&x10" then gp=10;
if &group="&x20" then gp=20;
if &group="&x30" then gp=30;
if &group="&x40" then gp=40;
if &group="&x50" then gp=50;
if &group="&x60" then gp=60;
if &group="&x70" then gp=70;
if &group="&x80" then gp=80;
if &group="&x90" then gp=90;
if gp=. then delete; **delete unspecifed group levels;
*** figure out xvariables;
gp2=gp; **x-var for left justifed plot;
gp3=gp; **x-var for centered plot;
med=(count+1)/2;
if count ne . then do;
do i=1 to count;
gp2=gp+( (i-1)*&space);
gp3=(gp2+1)-med*&space;
output;
end;
end;
else do;
gp2=gp-2*&space; gp3=gp-4*&space; output;
end;
%if &outdata^= %then %do;
data &outdata; set _p2;
%end;
proc format; value gpf 0="&x00 " 10="&x10 " 20="&x20 " 30="&x30 "
40="&x40 " 50="&x50 " 60="&x60 " 70="&x70 "
80="&x80 " 90="&x90 " other=" ";
symbol v=&sym h=&ht i=none;
symbol2 v=x i=none; **mean;
symbol3 v=plus i=none; **median;
%if %upcase(&justify)= C %then %do; **centered plot;
proc gplot gout=jit;
plot &y*gp3=1
%if %upcase(&mn_md)= X or %upcase(&mn_md)= B %then %do;
mn*gp3=2
%end;
%if %upcase(&mn_md)= M or %upcase(&mn_md)= B %then %do;
md*gp3=3
%end;
%end;
%if %upcase(&justify)= L %then %do; **left justified plot;
proc gplot gout=jit;
plot &y*gp2=1
%if %upcase(&mn_md)= X or %upcase(&mn_md)= B %then %do;
mn*gp2=2
%end;
%if %upcase(&mn_md)= M or %upcase(&mn_md)= B %then %do;
md*gp2=3
%end;
%end;
/ overlay haxis=0 to 100 by 10 hminor=0 &yaxis ;
%if %upcase(&mn_md)= M %then %do;
footnote .j=l .h=1 'Note: + = median';
%end;
%if %upcase(&mn_md)= X %then %do;
footnote .j=l .h=1 'Note: X = mean ';
%end;
%if %upcase(&mn_md)= B %then %do;
footnote .j=l .h=1 'Note: X = mean, + = median';
%end;
%if &glabel ^= %then %Do;
label gp2="&glabel" gp3="&glabel";
%end;
%else %do;
label gp2="&group" gp3="&group";
%end;
format gp2 gp3 gpf.;
run; quit;
goptions reset=symbol;
options _last_=&data ;
proc datasets nolist; delete _wk _p1 _p2 _mnmd;
footnote; run; quit;
%mend jitplot;