BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
_LB
Fluorite | Level 6 _LB
Fluorite | Level 6

To all,

I have a bar graph that in some months is missing one component or another that leaves an unsightly gap in the graph and confuses the viewer when it occurs.

IS there anyway to simply "migrate" the bars left or right.

My template follows below in addition to a rendering of the graph.

Any help much appreciated-

LawrenceSASRENDER.JPG

proc template;

  define statgraph BarLineMulti;

    begingraph;

    entrytitle halign=left  TEXTATTRS=(color=blue size=18pt) "&&siteb&i"  ;

     entrytitle halign=right   TEXTATTRS=(size=11pt) "&MONTHG TOTAL: &TOTG"  ;

     entrytitle halign=right   TEXTATTRS=(size=9pt) "RN: &RNG           MD: &MDG"  ;

     entrytitle halign=right   TEXTATTRS=(size=9pt) "RT: &RTG   OTHERS: &OTH";

       layout overlay / xaxisopts=(display=(line ticks tickvalues )) cycleattrs=true  yaxisopts=(LABEL=('COMPLIANCE RATE') offsetmin=0.0 offsetmax=0.05 griddisplay=on linearopts=(tickvaluesequence=(start=0 end=1 increment=.1))) ;

          barchart x=date y=RN / skin=modern  FILLATTRS =(color=PINK) includemissinggroup=false  discreteoffset=-0.3 barwidth=0.2 name="RN" legendlabel="RN";

          barchart x=date y=MD /skin=modern FILLATTRS =(color=LIPGR) includemissinggroup=false  discreteoffset=-0.1 barwidth=0.2 NAME="MD/NP/PA (Provider)" legendlabel="MD/NP/PA (Provider)";

          barchart x=date y=RT/skin=modern FILLATTRS =(color=BIBG) includemissinggroup=false discreteoffset= 0.1 barwidth=0.2 name="RT" legendlabel="RT";

          barchart x=date y=OTHER /skin=modern FILLATTRS =(color=BIO) includemissinggroup=false discreteoffset= 0.3 barwidth=0.2 name="OTHERS" legendlabel="OTHERS";

          seriesplot x=date y=p / lineattrs=graphdatadefault(thickness=3 color=red) name="Overall"    LEGENDLABEL="Overall" ;

           ReferenceLine y=.85 / clip=true Lineattrs=( Pattern=solid thickness=4 color=blue) name="IAP GOAL 85%" legendlabel="IAP GOAL 85%";

          scatterplot x=date y=P /    markerattrs=(symbol=circlefilled size=30 color=yellow) /*name="Overall"  LEGENDLABEL="Overall"*/;

          scatterplot x=date y=P / markerattrs=(symbol=circle size=31 color=red) ;

          scatterplot x=date y=P / markercharacter=p /*discreteoffset= -0.1*/ markercharacterattrs=(color=red weight=bold);

          discretelegend   "RN" "MD/NP/PA (Provider)" "RT" "OTHERS" "Overall" "IAP GOAL 85%" /

    location=outside  valign=bottom;

       endlayout;

     endgraph;

  end;

run;

1 ACCEPTED SOLUTION

Accepted Solutions
Jay54
Meteorite | Level 14

Using SAS 9.3, to do what you want, you need to create a "grouped" data structure.  Now, instead of having a separate column for each response for RN, MD, RT, etc, you need a column for response (compliance) with a group variable (say- type) which will have the values RN, MD, etc.  Now, use one BARCHART statement:

     

BARCHART x=date y=compliance / group=type groupdisplay=cluster;

Since the SERIESPLOT is not grouped, that data will need to be in a separate column, with only one data value for each date value..   
If you are using skins, change that to DATASKIN=PRESSED.
Feel free to email me if you have questions.

View solution in original post

4 REPLIES 4
Jay54
Meteorite | Level 14

The short answer is "not by using some option".  Specific discrete offsets are set for each of the four bar statements.  So, each bar chart is offset by the amount you specified.  Any particular bar chart does not know if the other one has missing data for any one category.  If this is absolutely crucial, you could set up a barchart statement for each bar separately, and then set each discrete offset individually after taking into account missing values across all bar charts. But that may not be a scalable / portable solution.

While this is of no help to you now, the behavior you want (compressing out of unused space of missing values) is implemented in V9.3 for grouped bar charts with GROUPDISPLAY=CLUSTER.  We can do this in this case since this is one bar chart statement with groups, so it knows about the missing values, and can compress them out.

_LB
Fluorite | Level 6 _LB
Fluorite | Level 6

Sanjay, I will keep that in mind in the future as to GROUPDISPLAY=CLUSTER.

In the interim, I'll have to live with it. The concept of setting each discrete offset seems cumbersome.

I'll see whether UCSF is update to version 9.3 yet. Hope you are enjoying SF.

Lawrence

_LB
Fluorite | Level 6 _LB
Fluorite | Level 6

Sanjay,

good news-I am getting SAS 9.3. SO where exactly do I place this statement!

Lawrence

Jay54
Meteorite | Level 14

Using SAS 9.3, to do what you want, you need to create a "grouped" data structure.  Now, instead of having a separate column for each response for RN, MD, RT, etc, you need a column for response (compliance) with a group variable (say- type) which will have the values RN, MD, etc.  Now, use one BARCHART statement:

     

BARCHART x=date y=compliance / group=type groupdisplay=cluster;

Since the SERIESPLOT is not grouped, that data will need to be in a separate column, with only one data value for each date value..   
If you are using skins, change that to DATASKIN=PRESSED.
Feel free to email me if you have questions.

SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 4 replies
  • 1950 views
  • 3 likes
  • 2 in conversation