/* Associate the libref MAPS with your SAS map */
/* library. For many sites this is automatically */
/* done when the SAS System is invoked. */
libname maps '
/* SAS maps library */
';
/* Set options for rotation, default fonts, and */
/* sizing units. Also set NODISPLAY so that map */
/* and bar chart are not displayed while they are */
/* being created. DISPLAY is turned back on when */
/* the graphs are combined with PROC GREPLAY. */
goptions rotate=landscape ftext=zapfb gunit=pct nodisplay;
/* A blank title is used with the map to reserve */
/* space for the title to be used with the bar */
/* chart that follows. */
title1 h=6 ' ';
/* use a solid fill for the map. */
pattern1 color=graycc value=ms;
/* Create the US map with PROC GMAP using the */
/* MAPS.US map data set as both the map and */
/* response data set. Specifying LEVELS=1 */
/* causes the same pattern to be used for all */
/* the states. The NOLEGEND option suppresses */
/* the map legend. */
proc gmap data=maps.us map=maps.us;
id state;
choro state / name='map'
levels=1
nolegend;
run;
/* Generate the data to be used for the bar chart. */
data mileage;
input age $ sex $ amount;
cards;
65-up m 7199
65-up f 4502
55-64 m 12304
55-64 f 5428
45-54 m 14701
45-54 f 9915
35-44 m 15916
35-44 f 12653
25-34 m 16683
25-34 f 15124
16-24 m 10718
16-24 f 6047
run;
/* Create an Annotate data set (LABELS) to be */
/* used to place the male and female symbols */
/* and statistics on the bars. This is done by */
/* setting the MILEAGE data set and outputting */
/* two observations to the LABELS data set for */
/* each observation in the MILEAGE data set. The */
/* first observation output will generate the */
/* symbol and the second will generate the */
/* statistic for each bar.
data labels;
length style color function text $ 8;
retain function 'label' color 'white' when 'a'
xsys ysys '2' hsys '3' size 4;
set mileage;
/* The vertical position of the annotated */
/* text is determined by using the MIDPOINT */
/* and GROUP variables. */
midpoint=sex;
group=age;
/* Use the MARKER font to display the male */
/* and female symbols. Setting X=0 sets the */
/* horizontal position of the symbol at the */
/* beginning of the bar and the POSITION */
/* variable left aligns the symbols. */
style='marker';
X=0;
position='>';
/* Use different symbols for male and female. */
if sex='f'
then text='R';
else text='Q';
output;
/* Reset the font from MARKER to the default */
/* font (ZAPFB). Setting X=AMOUNT places the */
/* statistic at the end of the bar and the */
/* POSITION variable right aligns the */
/* statistic. The TEXT variable contains */
/* the statistic value formatted with a */
/* COMMA9. format. */
style=' ';
x=amount;
position='<';
text=left(put(amount, comma9. ));
output;
/* Drop variables not needed for */
/* annotation. */
drop age sex amount;
run;
/* Specify the title and footnote for the bar */
/* chart. The MOVE= option positions the */
/* registered trademark symbol slightly above */
/* the text and returns to the original */
/* vertical position for the rest of the text. */
title1 height=6 color=black
'Average Mileage Driven Annually';
footnote height=2 justify=r color=black 'SAS/GRAPH'
move=(+0,+.5) '02'x move=(+0,-.5) ' Software ';
/* The AXIS1 statement is assigned to the group */
/* axis (GAXIS) and specifies the height, color, */
/* and justification of the the group (AGE) */
/* axis label. The AXIS2 statement is assigned */
/* to both the midpoint (MAXIS) and response */
/* (RAXIS) axes and is used to suppress the */
/* axes, tick marks, and tick labels. */
axis1 label=(justify=r color=black height=4 'Age')
value=(height=4 color=black)
style=0;
axis2 label=none value=none
major=none minor=none
style=0;
/* Specify a separate bar pattern for each sex. */
pattern1 value=solid color=gray44;
pattern2 value=solid color=gray66;
/* Produce the bar chart with annotation. */
/* PATTERNID=MIDPOINT causes separate patterns */
/* to be used for each sex. NOSTATS suppresses */
/* statistics that are printed to the right */
/* by default. */
proc gchart data=mileage;
hbar sex / name='bars'
discrete
anno=labels
sumvar=amount
group=age
gaxis=axis1
raxis=axis2
maxis=axis2
width=3
space=0
gspace=1
nostats
patternid=midpoint
coutline=black;
run;
/* Set the DISPLAY option so that the final */
/* graph is displayed on the output device, */
/* then use PROC GREPLAY to overlay the */
/* two graphs. */
goptions display;
proc greplay nofs igout=gseg;
/* Create a temporary catalog (TEMPCAT) */
/* to contain a template (WHOLE) that is */
/* a single panel covering the whole */
/* display area. */
tc tempcat;
tdef whole 1 /;
/* Replay both graphs into the same template */
/* panel. Specify the MAP graph first so it */
/* is drawn underneath the bar chart. */
template whole;
tplay 1:map 1:bars;
quit;