data gsales93; length city $13; input city & $ sales; cards; Chicago 59852330 Dallas 48198208 Los Angeles 45668204 Atlanta 37915024 San Francisco 31774845 Denver 28285189 New York 27441937 ; proc means data=gsales93 max noprint; var sales; output out=max max=max; run; data _null_; set max; call symput('max',max); run; proc sort data=gsales93; by city; proc sort data=maps.uscity out=uscity; by city; data cityloc; merge uscity(in=incities) gsales93(in=indata); by city; if incities and indata; x=long*arcos(-1)/180; y=lat*arcos(-1)/180; state=x+100; run; data states; set maps.states; if state=2 or state=15 or state=72 then delete; if density lt 4; run; data allmap; set states cityloc; run; proc gproject data=allmap out=allproj project=gnomon polelong=160 polelat=45; id state; run; data anno usmap; set allproj; if state gt 100 then output anno; else output usmap; run; proc sort data=anno; by descending y; run; data anno; set anno end=eof; length function style color $ 8 text $30; /* XSYS and YSYS coordinate systems are defined so that x */ /* and y values are interpreted as data values. HSYS is */ /* set to use screen percentage values. The variable WHEN */ /* dictates that the annotation will be drawn after the */ /* graph is drawn. */ xsys='2'; ysys='2'; hsys='3'; when='a'; /* Place the star character from the MARKER font at each city */ /* location, centered at the x/y coordinate. */ function='label'; color='black'; position='+'; size=4; style='marker'; text='V'; output; /* Change x and y coordinate systems to reflect screen */ /* percentages and draw a line to an x position of 70 percent */ /* of graphics output area. The corresponding y position for */ /* each line decreases based on the observation number in */ /* increments of 10 percent starting at a y position of 90 */ /* percent. */ function='move'; output; function='draw'; size=.25; xsys='3'; ysys='3'; x=70; ystart=90; y=ystart-(_n_*10); /* Create variables to store the current x/y position for use */ /* later in the DATA step. */ xhold=x; yhold=y; output; /* Draw a bar to reflect the gross sales figure for each */ /* regional office. The length of each bar is scaled based on */ /* the maximum data value which has a length of 25 percent. */ /* The width of each bar is 5 percent of the graphics output */ /* area. */ function='move'; y=y-2.5; output; function='bar'; x=70+(25*(sales/&max)); y=y+5; style='solid'; color='black'; output; /* Label each bar with the city name and associated sales */ /* value beginning at the previously stored location on the */ /* on the left side of the bar. */ function='label'; x=xhold+1; y=yhold; style='swissl'; color='white'; position='>'; size=1.75; text=left(put(sales,dollar15.)); output; y=y+2.5; position='3'; color='black'; text=trim(left(city)); output; run; /* set graphics options */ goptions reset=all target=psll ftext=swissl; title1 h=2 f=swiss 'Gross Sales for Regional Offices'; footnote1 a=90 h=35 pct ' '; footnote2 j=l 'SAS/GRAPH' move=(+0,+.5) '02'x move=(+0,-.5) ' Software'; pattern1 v=empty c=black r=50; proc gmap data=usmap map=usmap all; id state; choro state / nolegend anno=anno; run; quit;