%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;