/**********************************************************************/
data st_data1;
input state $ sites product;
cards;
AL 90 1
FA 22 1
GA 46 1
NY 55 1
VT 38 1
AL 45 2
FA 29 2
GA 41 2
NY 36 2
VT 24 2
;
run;
/**********************************************************************/
proc means data=st_data1 noprint;
by product state;
var sites;
output out=st_data2 sum=sum1;
run;
/**********************************************************************/
proc means data=st_data2 noprint;
by product;
var sum1;
output out=st_data3 sum=sum2;
run;
/**********************************************************************/
data merged;
merge st_data2 st_data3;
by product;
run;
/**********************************************************************/
data st_data;
keep sum product sum1;
set merged;
by product; sum = round(sum1 / sum2 * 360);
run;
/**********************************************************************/
proc print;
title 'Output 1';
run;
/**********************************************************************/
goptions reset=all gunit=pct cback=white ctext=black border
target=dj1200ps;
/**********************************************************************/
%MACRO PIE3D(
ds, /* Input data set */
slc_cnt, /* Number of midpoint values, ie., number of pie slices */
slice1, /* List the midpoint values in order */
slice2,
slice3,
slice4,
slice5,
color1, /* List the colors of the pie slices in order */
color2,
color3,
color4,
color5,
shade, /* Color of the pie's edge */
outline, /* Color of the pie's outline */
val_col, /* Color of the pie's slice */
xcenter, /* Horizontal center of the pie (pct) */
ycenter, /* Vertical center of the pie (pct) */
majaxis, /* Horizontal length of the pie (pct) */
minaxis, /* Vertical length of the pie (pct) */
thicknes, /* Thickness of the pie (pct) */
legnlabl, /* Legend label */
legendx, /* Horizontal center of the legend (pct) */
legendy, /* Vertical center of the legend (pct) */
titlex, /* Horizontal position of the title (pct) */
titley, /* Vertical position of the title (pct) */
titletxt, /* Text of the title */
by_var /* The BY variable used to create multiple pies */
);
/**********************************************************************/
goptions colors=(&color1 &color2 &color3 &color4 &color5 &shade
&outline &val_col);
/**********************************************************************/
data b;
drop sum sum1 i;
retain i 1;
array slice{&slc_cnt} s1 - s&slc_cnt;
array sliceb{&slc_cnt} sb1 - sb&slc_cnt;
do i = 1 to &slc_cnt;
set &ds; by &by_var;
slice{i} = sum;
sliceb{i} = sum1;
end;
run;
proc print;
title 'Output 2';
run;
/**********************************************************************/
goptions reset=title;
/**********************************************************************/
data piechart;
array slice{&slc_cnt} s1 - s&slc_cnt;
array sliceb{&slc_cnt} sb1 - sb&slc_cnt;
set b;
by &by_var;
x=&xcenter;
y=&ycenter;
maj=&majaxis;
min=&minaxis;
rc=ginit();
rc=graph('clear', 'piechart');
rc=gset('window',1,0,0,100,100);
rc=gset('transno',1);
/**********************************************************************/
/* Draw the bottom of the pie. */
rc=gset('filcolor', &slc_cnt+1);
rc=gset('filtype', 'solid');
rc=gdraw('ellipse', x, y-&thicknes, maj, min, 0, 360, 0);
/* Draw the outline of the bottom of the pie. */
rc=gset('filcolor', &slc_cnt+2);
rc=gset('filtype', 'hollow');
rc=gdraw('ellipse', x, y-&thicknes, maj, min, 0, 360, 0);
/* Draw the i'th pie slice. */
total_s = 0;
%do i = 1 %to &slc_cnt;
rc=gset('filcolor', &i);
rc=gset('filtype', 'solid');
rc=gdraw('ellipse', x, y, maj, min, total_s, s&i+total_s, 0);
/* Draw the outline for the i'th pie slice. */
rc=gset('filcolor', &slc_cnt+2);
rc=gset('filtype', 'hollow');
rc=gdraw('ellipse', x, y, maj, min, total_s, s&i+total_s, 0);
/* Calculate the x and y position along the outer edge for the */
/* center of the i'th pie slice. */
pi=arcos(-1);
tilt_ang=0;
if (&i = 1) then end_ang = (s&i/2)*pi/180;
if (&i > 1) then end_ang=((total_s + s&i - (s&i/2))*pi)/180;
xtop=&xcenter + (cos(tilt_ang) * cos(end_ang) * &majaxis*.6) -
(&minaxis*.6 * sin(end_ang) * sin(tilt_ang));
ytop=&ycenter + (sin(tilt_ang) * cos(end_ang) * &majaxis*.6) +
(&minaxis*.6 * sin(end_ang) * cos(tilt_ang));
/* Position the i'th pie slice value away from the pie so */
/* that the text does not overlay the pie. */
rc=gset('texfont', 'swiss');
rc=gset('texcolor', &slc_cnt+3);
rc=gset('texheight',2.5);
if (s&i/2 + total_s le 90) then do;
xtop=xtop-&thicknes;
rc=gdraw('text',xtop,ytop,left(trim(put(sb&i,4.0))));
end;
if (s&i/2 + total_s > 90) and (s&i/2 + total_s le 180) then do;
xtop=xtop-&thicknes*3;
rc=gdraw('text',xtop,ytop,right(trim(put(sb&i,4.0))));
end;
if (s&i/2 + total_s > 180) and (s&i/2 + total_s le 270) then do;
xtop=xtop-&thicknes*3; ytop=ytop-&thicknes*2;
rc=gdraw('text',xtop,ytop,right(trim(put(sb&i,4.0))));
end;
if (s&i/2 + total_s > 270) then do;
xtop=xtop-&thicknes; ytop=ytop-&thicknes*2;
rc=gdraw('text',xtop,ytop,left(trim(put(sb&i,4.0))));
end;
/* Draw a vertical line on the edge of the pie to separate the */
/* slices that are positioned in the bottom half of the pie. */
total_s = total_s + s&i;
if (total_s > 180) and (total_s < 360) then do;
pi=arcos(-1);
tilt_ang=0;
end_ang=(total_s*pi)/180;
xtop=&xcenter + (cos(tilt_ang) * cos(end_ang) * &majaxis*.5) -
(&minaxis*.5 * sin(end_ang) * sin(tilt_ang));
ytop=&ycenter + (sin(tilt_ang) * cos(end_ang) * &majaxis*.5) +
(&minaxis*.5 * sin(end_ang) * cos(tilt_ang));
xbottom=&xcenter + (cos(tilt_ang) * cos(end_ang) * &majaxis*.5) -
(&minaxis*.5 * sin(end_ang) * sin(tilt_ang));
ybottom=&ycenter-&thicknes + (sin(tilt_ang) * cos(end_ang) * &majaxis*.5) +
(&minaxis*.5 * sin(end_ang) * cos(tilt_ang));
rc=gset('lincolor', &slc_cnt+2);
rc=gset('linwidth', 1);
rc=gdraw('line', 2, xtop, xbottom, ytop, ybottom);
end;
%end;
/* Display the first title. */
rc=gset('texfont', 'swissb');
rc=gset('texcolor', 1);
rc=gset('texheight',4);
rc=gdraw('text',&titlex, &titley, "&titletxt");
/* Display the second title. This section of code is optional. */
rc=gset('texfont', 'swiss');
rc=gset('texcolor', 1);
rc=gset('texheight',3);
rc=gdraw('text',37, &titley-4, upcase("&by_var ")||put(product,2.));
/* Display the legend label. */
rc=gset('texfont','swissb');
rc=gset('texcolor', 1);
rc=gset('texheight',3);
rc=gdraw('text',&legendx-5, &legendy, "&legnlabl");
/* Draw the i'th legend bar. */
y_pos = &legendy-3;
%do i = 1 %to &slc_cnt;
rc=gset('filcolor', &i);
rc=gset('filtype', 'solid');
rc=gdraw('bar',&legendx-6, y_pos-3, &legendx-3, y_pos);
/* Draw the i'th legend value. */
rc=gset('texfont', 'swiss');
rc=gset('texcolor', 1);
rc=gset('texheight', 3);
rc=gdraw('text', &legendx, y_pos-3, "&&slice&i");
y_pos=y_pos-4;
%end;
/* Display the graph and end DSGI. */
rc=graph('update');
rc=gterm();
run;
/* End the macro definition. */
%MEND PIE3D;
/* Finally, make the macro call to PIE3D. */
%PIE3D(
ds=st_data, /* Input data set */
slc_cnt=5, /* Number of midpoint values, ie., number of pie slices */
slice1=Alabama, /* List the midpoint values in order */
slice2=Florida,
slice3=Georgia,
slice4=New York,
slice5=Vermont,
color1=blue, /* List the colors of the pie slices in order */
color2=green,
color3=gold,
color4=magenta,
color5=olive,
shade=graybb, /* Color of the pie's edge */
outline=black, /* Color of the pie's outline */
val_col=black, /* Color of the pie's slices */
xcenter=50, /* Horizontal center of the pie (pct) */
ycenter=61, /* Vertical center of the pie (pct) */
majaxis=50, /* Horizontal length of the pie (pct) */
minaxis=30, /* Vertical length of the pie (pct) */
thicknes=2, /* Thickness of the pie (pct) */
legnlabl=STATES, /* Legend label */
legendx=48, /* Horizontal center of the legend (pct) */
legendy=30, /* Vertical center of the legend (pct) */
titlex=12, /* Horizontal position of the title (pct) */
titley=91, /* Vertical position of the title (pct) */
titletxt=Number of Sites per State, /* Text of the title */
by_var=product /* The BY variable used to create multiple pies */
);