Hi there,
I've previously asked a question about adding significance stars to my proc sgplot. That's working now, however I also need to use a log scale. I'm getting the same note I've seen a lot around these SAS forums, Log axis cannot support zero or negative values in the data range. I don't have any zero or negative values in my data, so I don't understand where this note is coming from. I've seen the warnings about using a log scale in bar charts, however my client is insisting (the difference in concentrations between the two endpoints is huge). This is my code, do you have an idea how to solve this?
PROC SGPLOT DATA=werk10;
VBARPARM CATEGORY=group RESPONSE=gm/ GROUP=type
DATASKIN=pressed LIMITUPPER=Upper2;
SCATTER x=group y=upper3/ DATALABEL=label DATALABELATTRS=(SIZE=18)
MARKERATTRS=(COLOR=white SIZE=1) LEGENDLABEL=" ";
XAXIS DISCRETEORDER=DATA;
YAXIS LABEL="Geometric mean (AU/mL)" MIN=10 MAX=400000
TYPE=LOG LOGSTYLE=LOGEXPAND LOGBASE=10;
KEYLEGEND / TITLE="Groups";
RUN;
I'm still using SAS version 9.3, group is the variable for treatment group and type the variable for my endpoints.
Test data (in the form of a datastep)? We won't be able to see what is happening on your machine unless you show us some test data which causes this - likely to round a value which isn't 0 to 0 or something. Also, don't code in captials, it makes reading the code so much harder.
The VBARPARM statement is trying to draw the bars from 0 to the gm for each value of GROUP and TYPE. This is impossible on a log axis because the bars would have to be infinitely long.
The solution is the use the BASELINE= option, which was introduced in SAS 9.4m1. However, you can only specify the baseline for "freestanding" bars. Your code indicates you are using a stacked bar chart, which assumes that the baseline is 0. Switch to GROUPDISPLAY=CLUSTER and you will be able to display the bar chart on the log scale, as follows:
data A;
input cat type y;
datalines;
0 0 100
0 1 1000
1 0 500
1 1 30000
;
PROC SGPLOT DATA=A;
VBARPARM CATEGORY=cat RESPONSE=Y/ GROUP=type baseline=10 groupdisplay=cluster;
XAXIS DISCRETEORDER=DATA;
YAXIS LABEL="Geometric mean (AU/mL)" MIN=10 MAX=40000
TYPE=LOG LOGSTYLE=LOGEXPAND LOGBASE=10;
KEYLEGEND / TITLE="Groups";
RUN;
Thank you for your quick responses. RW; the coding in capitals is standard in our company so I just copied it.
Rick; I've tried the groupdisplay and baseline functions before, but these doesn't seem to be working for vbparm at least in version 9.3 (I'm getting a syntax error).
Yes, because in my response I explicitly state that the BASELINE= option "was introduced in SAS 9.4m1."
See my article on using log response axes with bar charts: http://blogs.sas.com/content/graphicallyspeaking/2012/04/25/bar-chart-with-log-response-axis/. You will need to ensure the y-axis does not have zero in it. Normally, all bar charts will start from zero, or have a zero baseline. You can set y axis min=0.1 or some small value. Also set the baseline. Note, the value you select can change the way the bar chart is displayed.
With SAS release prior to V9.40M1, you can use the HighLow bar to simulate a bar chart with a baseline different from zero as shown in the linked article
Thanks Sanjay. Am I correct in saying that if I use this highlow option, I can't add an upper limit bar anymore? My main struggle throughout this excersize has been trying to show the mean with CI AND have a log scale axis..
With SGPLOT you can often acheive the result you want by overlaying different plot types. I suggest you can use a scatter plot overlay, using its YERRORUPPER option to display the error bar. You can set the markerattrs=(size=0) to hide the marker itself.
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.