>> I originally posted this on the ODS board and was recommended to repost this here.
I hope I'm not missing an easy answer, but it's not for lack of diligence. I'm trying to use GTL to define a fairly basic horizontal bar chart. For the life of me I can't find an option to allow me to sort the bars by frequency. Is there an equivalent GTL option to CATEGORYORDER=RESPDESC? I suspect there is since this is would be a common need.
Bob
proc template;
define statgraph FlagBarCharts;
dynamic byvar;
begingraph;
entrytitle "Flag Variable: " byvar ;
layout overlay
/ border=false
WALLDISPLAY=none
xaxisopts=(
label=' '
linearopts=(viewmax=10));
BARCHARTPARM x=subcat y=percent
/ orient=horizontal;
endlayout;
endgraph;
end;
run;
Such an option is coming soon. In the meantime, you can do this is by getting the frequencies using PROC FREQ, sort as needed, then use the SGPLOT HBAR or GTL BARCHART to draw the bars. GTL will retain data order by default. For SGPLOT will order your categories by default. You have to set XAXIS DISCRETEORDER to DATA.
If it's termed the default behavior, does that mean that there are options? ...or is that what BARCHART always does? If so then the user must manually sort the data. It seems as though that would be more easily handled at graph time, moreso for BARCHART than BARCHARTPARM, and the option would be frequently needed.
Bob
Such an option is coming soon. In the meantime, you can do this is by getting the frequencies using PROC FREQ, sort as needed, then use the SGPLOT HBAR or GTL BARCHART to draw the bars. GTL will retain data order by default. For SGPLOT will order your categories by default. You have to set XAXIS DISCRETEORDER to DATA.
Just saw your post Sanjay after I replied. Thanks
Hi Bob,
Copying my response from the original thread, did you try it and get different results that you wanted?
I saw your response that the linearopts applied to the response axis. But since your BARCHARTPARM was x=subcat, I think xaxisopts applies to the x axis, which in this case is the vertical axis because it's a horizontal plot. When I ran the code with linearopts removed from the xaxisopts, and then sorted the data, it seemed to give the result you wanted (consistent with Sanjay's note that GTL would user data order by default).
My original response:
I'm new to GTL, but I think if you remove the linearopts= option, then the categories will be ordered according to the order of the input dataset. I guess when you added linearopts=, it forced the xaxis to be linear, instead of categorical.
proc template; define statgraph FlagBarCharts; dynamic byvar; begingraph; entrytitle "Flag Variable: " byvar ; layout overlay / border=false WALLDISPLAY=none xaxisopts=( label=' ' ); BARCHARTPARM x=subcat y=percent / orient=horizontal ; endlayout; endgraph; end; run; data in; subcat='1'; percent=2; output; subcat='2'; percent=6; output; subcat='3'; percent=4;output; run; proc sort data=in; by percent; run; ods pdf file="d:\junk\me.pdf"; proc sgrender data=in template=FlagBarcharts; run; ods pdf close;
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.