%let gpath='C:\';
%let dpi=200;
ods html close;
ods listing gpath=&gpath image_dpi=&dpi;
/*--Subset data by removing Hybrid cars--*/
data cars;
set sashelp.cars(where=(type ne 'Hybrid'));
run;
/*--Default graph--*/
proc template;
define statgraph bar;
dynamic _resp _footnote _order;
begingraph;
entrytitle 'Mileage by Origin and Type';
entryfootnote halign=left "Data Set = " _footnote;
layout overlay / xaxisopts=(display=(tickvalues));
barchart category=Origin response=_resp / group=Type groupdisplay=cluster
stat=mean outlineattrs=graphdatadefault name='a' ;
discretelegend 'a' / sortorder=_order;
endlayout;
endgraph;
end;
run;
/*--Plot of original unsummarized data--*/
ods graphics / reset width=5in height=3in imagename='BarCars';
proc sgrender data=cars template=bar;
dynamic _resp="mpg_city" _footnote="sashelp.cars";
run;
/*--Graph of unsummarized data with sorted Legend--*/
ods graphics / reset width=5in height=3in imagename='BarCarsSortedLegend';
proc sgrender data=cars template=bar;
dynamic _resp="mpg_city" _footnote="sashelp.cars (Sorted Legend)" _order='ascendingformatted';
run;
/*--Compute mean mileage by Origin and Type--*/
proc means data=cars noprint;
class origin type;
var mpg_city;
output out=carmeans(where=(_type_ > 2))
mean=MeanMpg
n=N;
run;
/*--Graph of summarized data--*/
ods graphics / reset width=5in height=3in imagename='BarCarMeans';
proc sgrender data=carmeans template=bar;
dynamic _resp="meanMpg" _footnote="CarMeans";
run;
/*--Graph of summarized data with sorted legend--*/
ods graphics / reset width=5in height=3in imagename='BarCarMeansSorted';
proc sgrender data=carmeans template=bar;
dynamic _resp="meanMpg" _footnote="CarMeans (Sorted Legend)" _order='ascendingformatted';
run;
/*--Sort by Origin and Descending Mean Mpg--*/
proc sort data=carMeans out=carMeansbyMPG;
by origin descending meanMpg;
run;
/*--Car Means descending Response--*/
ods graphics / reset width=5in height=3in imagename='BarCarMeansByMpg';
proc sgrender data=carMeansbyMPG template=bar;
dynamic _resp="meanMpg" _footnote="CarMeansByMpg (Sorted Legend)" _order='ascendingformatted';
run;
/*--Find original order of values for type--*/
proc means data=cars noprint order=data;
class type;
output out=carsorder(where=(_type_ > 0))
n=N;
run;
/*--Build Attrmap using original group values--*/
data attrmap;
retain Id 'Type' Linestyle 'graphdatadefault';
keep Id Value Fillstyle Linestyle;
length Value Fillstyle $ 30;
set carsorder;
value=type; Fillstyle='graphdata' || put(_n_, 1.0);
run;
/*--Car Means descending Response Sorted Legend and Attr Map--*/
ods graphics / reset width=5in height=3in imagename='BarCarMeansByMpgMap';
proc sgrender data=carMeansbyMPG template=bar dattrmap=attrmap;
dynamic _resp="meanMpg" _footnote="CarMeansByMpg (Sorted Legend + DAttrMap)"
_order='ascendingformatted';
dattrvar type='Type';
run;
/*--Build data set with original order for groups and missing category--*/
data carsorder2;
length origin $8;
set carsorder;
Origin='';
run;
proc print;run;
/*--Prepend the original order group values to sorted data--*/
data merged;
keep origin type meanmpg;
set carsorder2 carMeansbyMPG ;
run;
/*--Graph with Merged data--*/
ods graphics / reset width=5in height=3in imagename='BarCarMeansByMpgMerged';
proc sgrender data=merged template=bar;
dynamic _resp="meanMpg" _footnote="CarMeansByMpg (Merged Data)";
run;