I assigned labels however, I left your code 99% intact but wrapped inside an absolute layout (could use gridded also) and specified the dimension that you can change. You did not specify the output format so I picked pdf
data prim_sub_use; set xl.sheet1;
label
Alcohol ='^_^_Alcohol^_'
Opiates ='^_^_Opiates^_'
Cocaine ='^_^_Cocaine^_'
Marijuana='^_^_Marijuana/hashish^_'
Methamphetamine_amphetamines='^_Methamphetamine/amphetamines^_'
;
run;
ods escapechar='^';
ods _all_ close;
options nonumber nodate orientation=landscape papersize=letter nocenter
leftmargin=.5in rightmargin=.5in topmargin=.5in bottommargin=.5in;
ods pdf file="~/img/abuse.pdf" dpi=300 notoc;
ods layout absolute;
ods region x=0in y=0in width=10in;
ods graphics on /noborder height=7.5in width=10in scale=on;
proc sgplot data=prim_sub_use noborder nowall
description='Primary substance use at admission, 2007-2017';
series x=Year y=Alcohol/markers markerattrs=(symbol=CircleFilled
color='#0060A9' size=12) lineattrs=(color='#0060A9' thickness=3);
series x=Year y=Opiates/markers markerattrs=(symbol=TriangleDownFilled size=12
color='#ed1c24') lineattrs=(color='#ed1c24' thickness=3 pattern=solid);
series x=Year y=Cocaine/markers markerattrs=(symbol=SquareFilled
color='#ffc222' size=12) lineattrs=(color='#ffc222' thickness=3
pattern=solid);
series x=Year y=Marijuana/markers markerattrs=(symbol=DiamondFilled
color='#64c069' size=12) lineattrs=(color='#64c069' thickness=3
pattern=solid) ; * legendlabel="Marijuana/hashish";
series x=Year y=Methamphetamine_amphetamines/markers
markerattrs=(symbol=TriangleFilled size=12 color='#00a2e5')
lineattrs=(color='#00a2e5' thickness=3 pattern=solid);
yaxis label='Percent of all admissions aged 12 years and older' VALUES=(0 TO 50 BY 10) offsetmax=0 offsetmin=0;
xaxis label='Admission Year' VALUES=(2007 TO 2017 BY 1) display=(nolabel noticks);
keylegend/noborder linelength=30;
run;
ods graphics off;
ods layout end;
ods pdf close;
ods _ALL_ CLOSE;
I don't know. I don't remember anything like that. The first thing I would try is adding one or more nonbreaking spaces to the end of the drug name in a DATA step before you run sgplot.
drug = trim(drug) || 'A0'x;
If you are using a formatted numeric variable to get your drug names, then you will need to modify the approach accordingly.
I might be tempted to try something like
Keylegend / across=3 down=2;
and maybe play around with the LINELENGTH option to see about making the length of the lines shorter.
@martyvd wrote:
That may be an option, but I'd really prefer the legend to all be on 1 line if possible.
There is only so much space available. If the values are long enough there just is not much space left between the lines.
Did you try anything with the LINELENGTH to shorten the displayed line segments in the legend?
The NBSP suggestion originally came from Warren. Sorry about the incorrect attribution.
Also, my suggested usage of KEYLEGEND options may be more applicable for filled chicklets.
I am sure it can be done. Can you share your code and data (dummied up if it's confidential)
proc sgplot data=prim_sub_use noborder nowall description='Primary substance use at admission, 2007-2017';
series x=Year y=Alcohol/markers markerattrs=(symbol=CircleFilled color='#0060A9' size=12) lineattrs=(color='#0060A9' thickness=3);
series x=Year y=Opiates/markers markerattrs=(symbol=TriangleDownFilled size=12 color='#ed1c24') lineattrs=(color='#ed1c24' thickness=3 pattern=solid);
series x=Year y=Cocaine/markers markerattrs=(symbol=SquareFilled color='#ffc222' size=12) lineattrs=(color='#ffc222' thickness=3 pattern=solid);
series x=Year y=Marijuana/markers markerattrs=(symbol=DiamondFilled color='#64c069' size=12) lineattrs=(color='#64c069' thickness=3 pattern=solid) legendlabel="Marijuana/hashish";
series x=Year y=Methamphetamine_amphetamines/markers markerattrs=(symbol=TriangleFilled size=12 color='#00a2e5') lineattrs=(color='#00a2e5' thickness=3 pattern=solid);
yaxis label='Percent of all admissions aged 12 years and older' VALUES = (0 TO 50 BY 10) offsetmax=0 offsetmin=0;
xaxis label='Admission Year' VALUES = (2007 TO 2017 BY 1) display=(nolabel noticks);
keylegend/noborder linelength=30;
run;
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.