I am wondering how best to add a reference 'band' to a proc boxplot graph.
I have been able to add reflines (vref=) at the lower and upper limits but cannot change color (cvref) while using ods graphics. Here is the code and output.
proc boxplot data=work.living ;
by housing ;
where dow>'01NOV2018'd and age_today>=6 and housing="CF-2";
plot bcs*dow /
boxstyle=schematicid
vaxis=1 to 5 by 1
grid
vref=2.333 3.667
;
id db108;
insetgroup min max mean n ;
run;
But I'd rather use a lightly colored (transparent) band that indicates the reference range. I think I should be able to do this using an annotation data set (annoref) that defines a rectangle. But I seem to get nothing on the graph and nothing in the log to indicate why. Here is my current code, resulting graph and log for everything.
data work.annoref;
retain drawspace "WALLPERCENT" ;
length function $9 ;
input function $ height width x1 y1 ;
datalines;
rectangle 10 70 10 50
;
run;
proc print data=work.annoref ; run;
proc boxplot data=work.living ;
by housing ;
where dow>'01NOV2018'd and age_today>=6 and housing="CF-2";
plot bcs*dow /
boxstyle=schematicid
vaxis=1 to 5 by 1
grid
annotate=work.annoref
;
id db108;
insetgroup min max mean n ;
run;
791 title; title2; footnote;
792 proc boxplot data=work.living ;
793 by housing ;
794 where dow>'01NOV2018'd and age_today>=6 and housing="CF-2";
795 plot bcs*dow /
796 boxstyle=schematicid
797 vaxis=1 to 5 by 1
798 grid
799 vref=2.333 3.667
800 ;
801 id db108;
802 insetgroup min max mean n ;
803 run;
NOTE: Writing HTML Body file: sashtml2.htm
NOTE: Processing beginning for PLOT statement number 1.
NOTE: Processing started for the BY group housing=CF-2.
NOTE: Since the format DATE is associated with the group variable dow, it is assumed that the
natural interval between group positions is one DAY.
NOTE: The REPEAT option is assumed when a DATE format is used with a group variable.
NOTE: The above message was for the following BY group:
housing=CF-2
NOTE: There were 196 observations read from the data set WORK.LIVING.
WHERE (dow>'01NOV2018'D) and (age_today>=6) and (housing='CF-2');
NOTE: PROCEDURE BOXPLOT used (Total process time):
real time 1.34 seconds
cpu time 0.18 seconds
804
805 data work.annoref;
806 retain drawspace "WALLPERCENT" ;
807 length function $9 ;
808 input function $ height width x1 y1 ;
809 datalines;
NOTE: The data set WORK.ANNOREF has 1 observations and 6 variables.
NOTE: DATA statement used (Total process time):
real time 0.03 seconds
cpu time 0.03 seconds
811 ;
812 run;
813
814 proc print data=work.annoref ; run;
NOTE: There were 1 observations read from the data set WORK.ANNOREF.
NOTE: PROCEDURE PRINT used (Total process time):
real time 0.23 seconds
cpu time 0.03 seconds
815
816 proc boxplot data=work.living ;
817 by housing ;
818 where dow>'01NOV2018'd and age_today>=6 and housing="CF-2";
819 plot bcs*dow /
820 boxstyle=schematicid
821 vaxis=1 to 5 by 1
822 grid
823 annotate=work.annoref
824 ;
825 id db108;
826 insetgroup min max mean n ;
827 run;
NOTE: Processing beginning for PLOT statement number 1.
NOTE: Processing started for the BY group housing=CF-2.
NOTE: Since the format DATE is associated with the group variable dow, it is assumed that the
natural interval between group positions is one DAY.
NOTE: The REPEAT option is assumed when a DATE format is used with a group variable.
NOTE: The above message was for the following BY group:
housing=CF-2
NOTE: There were 196 observations read from the data set WORK.LIVING.
WHERE (dow>'01NOV2018'D) and (age_today>=6) and (housing='CF-2');
NOTE: PROCEDURE BOXPLOT used (Total process time):
real time 0.62 seconds
cpu time 0.10 seconds
I know I'm going to have to set the rectangle dimensions better, but I wanted just to see something before I tried to figure that part out next.
Thank you,
Dave
I'm not sure of your SAS version, but this is something you can do in SGPLOT:
proc sgplot data=sashelp.heart;
band x=sex upper=230 lower=180 / name="conf" legendlabel="confidence region";
vbox cholesterol / category=sex displaystats=(min max mean n);
keylegend "conf";
run;
Give that a try and see if it works for you.
Thanks!
Dan
I'm not sure of your SAS version, but this is something you can do in SGPLOT:
proc sgplot data=sashelp.heart;
band x=sex upper=230 lower=180 / name="conf" legendlabel="confidence region";
vbox cholesterol / category=sex displaystats=(min max mean n);
keylegend "conf";
run;
Give that a try and see if it works for you.
Thanks!
Dan
Thank you DanH_sas. That works nicely in 9.4. Here is my code and example figure. I like it a lot.
proc sgplot data=work.living ;
by housing ;
where dow>'01NOV2018'd and age_today>=6;
band x=dow upper=3.667 lower=2.333 / name="nr" legendlabel="normal range";
vbox bcs / category=dow displaystats=(min max mean n);
xaxis type=time display=(nolabel);
yaxis values=(1 to 5 by 1) grid ;
keylegend "nr";
run;
Registration is open! SAS is returning to Vegas for an AI and analytics experience like no other! Whether you're an executive, manager, end user or SAS partner, SAS Innovate is designed for everyone on your team. Register for just $495 by 12/31/2023.
If you are interested in speaking, there is still time to submit a session idea. More details are posted on the website.
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.