BookmarkSubscribeRSS Feed
KJC
Calcite | Level 5 KJC
Calcite | Level 5
  • I am trying to create a lattice layout with two rows and a header at the top for the months but the months don’t seem to be spacing evenly. January is too large so the rest of the months don’t line up with the data (see photo I attached)
  • I am also having a hard time labeling the axes to the left. I would like the axis for the top row to say “By Sex” and the bottom to say “Combined.” It Currently says "Female" and "overall"
  • Finally, I want both axes to go from 0 to 6 and have the same labels but the bottom one keeps staying at 1-4. I have attached my code.

ods graphics on;

ods path(prepend) work.templat(update);

data bpa2;

set WORK.bpa1;

if xc=1 then month='Jan';

else if xc=2 then month='Feb';

else if xc=3 then month='Mar';

else if xc=4 then month='Apr';

else if xc=5 then month='May';

else if xc=6 then month='Jun';

else if xc=7 then month='Jul';

else if xc=8 then month='Aug';

else if xc=9 then month='Sep';

else if xc=10 then month='Oct';

else if xc=11 then month='Nov';

else if xc=12 then month='Dec';

run;

Proc template;

  Define statgraph combined;

  Begingraph / designwidth=640px designheight=480px backgroundcolor=cxd5d9d2;

Layout lattice / columndatarange=unionall Columns=1 Rowgutter=5px Rowweights=(.50 .50);

columnaxes;

  columnaxis / display=none type=linear offsetmin=0 offsetmax=0

  linearopts=( thresholdmin=0.5 thresholdmax=0.5 viewmax=13);

endcolumnaxes;

  /*Row 1-Geometric means by sex*/

  /*Use sidebar rather than rowheaders so it will span both rows on the left*/

Sidebar/align=left;

  layout gridded / border=false;

  Entry 'Geometric Mean ' / rotate=90

  textattrs=(weight=bold) ;

endlayout;

endsidebar;

/*Scatterplots*/

layout overlay / cycleattrs=true yaxisopts=(griddisplay=off)

                 xaxisopts=(offsetmin=0.05 offsetmax=0.05 display=(line ticks)

                 linearopts=(viewmin=0 viewmax=6 tickvaluesequence=(start=0 end=11 increment=1)));

/*Display month names*/

Innermargin /align=top;

  Blockplot x=xc block=month / display=(fill outline values)

  Valuehalign=center valuevalign=center filltype=alternate

  fillattrs=graphaltblock altfillattrs=graphaltblock;

Endinnermargin;

   scatterplot x=eval(xc-0.20) y=Female / yerrorlower=f_lcl yerrorupper=f_ucl name='By Sex'

                                                markerattrs=graphdata1(color=CXBA7C87 size=9px weight=bold)

                                                errorbarattrs=graphdata1( color=CXBA7C87 pattern=solid thickness=2);

   scatterplot x=eval(xc-0.05) y=Male / yerrorlower=m_lcl yerrorupper=m_ucl /*name='Male' */

                                                markerattrs=graphdata2(color=CX8585A6 size=9px weight=bold)

                                                errorbarattrs=graphdata2(color=CX8585A6 pattern=solid thickness=2);

   seriesplot x=eval(xc-0.20) y=Female / lineattrs=graphdata1(color=CXBA7C87 pattern=solid  thickness=2px) /*name='Female'*/;

   seriesplot x=eval(xc-0.05) y=Male / lineattrs=graphdata2(color=CX8585A6 pattern=shortdash thickness=2px) /*name='Male'*/;

endlayout;

/*row two-overall*/

layout overlay / cycleattrs=true yaxisopts=(label='Overall' griddisplay=off)

                         xaxisopts=(offsetmin=0.05 offsetmax=0.05 display=(line ticks tickvalues)

                         linearopts=(viewmin=0 viewmax=6 tickvaluesequence=(start=0 end=12 increment=1)

                         ));

           scatterplot x=eval(xc) y=overall / yerrorlower=lcl yerrorupper=ucl

                                                markerattrs=graphdata1(color=black size=9px weight=bold)

                                                errorbarattrs=graphdata1( color=black pattern=solid thickness=2);

   seriesplot x=eval(xc) y=overall / lineattrs=graphdata1(color=black pattern=solid  thickness=2px) name='Overall';

  

  endlayout;

endlayout;

endgraph;

end;

run;


GTL.png
3 REPLIES 3
ballardw
Super User

Have tried explicitly setting the length of Month to 3?

length month $ 3;

if xc=1 then month='Jan';

etc.

Try assigning a label for the y variables in the SGRender to change the axis label.

and possibly a Rowdatarange=UnionAll as an option for the Layout Lattice statement to get the same axis values

KJC
Calcite | Level 5 KJC
Calcite | Level 5

Thanks. The rowdatarange=unionall suggestion worked perfectly.

Setting the length of month did not work. I think it has something to do with the thresholdmin and thresholdmax but I can't get them all to line up. Any suggestions there?

Jay54
Meteorite | Level 14

In general, if you want things to line up, you must use the same axis variables or at least variables with similar values. You are using XC and eval(Xc-0.2).  Not sure what effect this has.  You are using overlay of two columns with offsets.  It may be easier to use ClusterGroups for the scatter and series (SAS 9.3).  Also, you have Offsetmin of 5% which will add to the apparent length of January. 

If you attach the full working program with data, it may be easier to diagnose.

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

How to Concatenate Values

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 3 replies
  • 1108 views
  • 3 likes
  • 3 in conversation