BookmarkSubscribeRSS Feed
☑ This topic is solved. Need further help from the community? Please sign in and ask a new question.
SASGeek
Obsidian | Level 7

Hi all,

First, thanks so much for the great answers I've gotten on all my questions. You are all the best! I'm almost there with my project and I just need help with one more part. . .

 

I'm running SAS 9.4 on EG 7.15 and I have a butterfly chart where some values show 4000% and most others show 5% - 20%. I am able to label everything (thanks to great code provided here) EXCEPT those that are massive values. So I need to label some inside the bars and some outside the bars. I know there's an option for this but that doesn't come in until SAS 9.5. Here's the code I'm using for now:

 

proc format;
 picture posval low-<0='00000%'
 (prefix='-')
  0='9%'
  0<-high='00000%';
run;

data have;
call streaminit(123);
do date='01jan2022'd  to '20jan2022'd;
 value=rand('integer',-100,100);
 n=rand('integer',100,4000);
 group=ifc(value>0,'pos_diff','neg_diff');
 if value>0 then datalabel_pos=cats(value,"%|(",n,")");
  else datalabel_neg=cats(value,"%|(",n,")");
 output;
 call missing(datalabel_pos,datalabel_neg);
end;
format date date9.  value posval.;
run;



proc sgplot data=have;
hbarparm category=date response=value/group=group name='x' ;
text x=value y=date text=datalabel_pos/splitchar='|'   strip contributeoffsets=none 
SPLITCHAR='|'  SPLITJUSTIFY=left SPLITPOLICY=splitalways position=right ;
text x=value y=date text=datalabel_neg/splitchar='|'   strip contributeoffsets=none 
SPLITCHAR='|'  SPLITJUSTIFY=left SPLITPOLICY=splitalways position=left ;
keylegend 'x'/title='';
yaxis label=' ';
xaxis label=' ' offsetmin=0.1 offsetmax=0.1;
run;

 

 

Thank you!

 

Paula

1 ACCEPTED SOLUTION

Accepted Solutions
Ksharp
Super User
proc format;
 picture posval low-<0='00000%'
 (prefix='-')
  0='9%'
  0<-high='00000%';
run;

data have;
call streaminit(123);
do date='01jan2022'd  to '10jan2022'd;
 value=rand('integer',-100,100);
 n=rand('integer',100,4000);
 group=ifc(value>0,'pos_diff','neg_diff');
 datalabel=cats(value,"%|(",n,")");

 /*greater than 80 data label is inside,otherwise outside*/
 if value>=80 then _value=value-8;  
  else if value<=-80 then _value=value+8;
   else if 0<value<=80 then _value=value+8;
    else if -80<value<0 then _value=value-8;

 output;
end;
format date date9.  value posval.;
run;



proc sgplot data=have;
hbarparm category=date response=value/group=group name='x' ;
text x=_value y=date text=datalabel/splitchar='|'   strip contributeoffsets=none 
SPLITCHAR='|'  SPLITJUSTIFY=center SPLITPOLICY=splitalways position=center ;
keylegend 'x'/title='';
yaxis label=' ';
xaxis label=' ';
run;

Ksharp_0-1676718542012.png

 

View solution in original post

2 REPLIES 2
Ksharp
Super User
proc format;
 picture posval low-<0='00000%'
 (prefix='-')
  0='9%'
  0<-high='00000%';
run;

data have;
call streaminit(123);
do date='01jan2022'd  to '10jan2022'd;
 value=rand('integer',-100,100);
 n=rand('integer',100,4000);
 group=ifc(value>0,'pos_diff','neg_diff');
 datalabel=cats(value,"%|(",n,")");

 /*greater than 80 data label is inside,otherwise outside*/
 if value>=80 then _value=value-8;  
  else if value<=-80 then _value=value+8;
   else if 0<value<=80 then _value=value+8;
    else if -80<value<0 then _value=value-8;

 output;
end;
format date date9.  value posval.;
run;



proc sgplot data=have;
hbarparm category=date response=value/group=group name='x' ;
text x=_value y=date text=datalabel/splitchar='|'   strip contributeoffsets=none 
SPLITCHAR='|'  SPLITJUSTIFY=center SPLITPOLICY=splitalways position=center ;
keylegend 'x'/title='';
yaxis label=' ';
xaxis label=' ';
run;

Ksharp_0-1676718542012.png

 

SASGeek
Obsidian | Level 7
Thank you so very much. I truly appreciate your helping me through this project!

SAS INNOVATE 2024

Innovate_SAS_Blue.png

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. 

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.

Get the $99 certification deal.jpg

 

 

Back in the Classroom!

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

View all other training opportunities.

Discussion stats
  • 2 replies
  • 268 views
  • 0 likes
  • 2 in conversation