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

Hi All,

how can i annotate the values correctly if i have +ve & -ve values in data. My code works well for most, if the value is +ve. If the values are negative then output is disorientated. the annotation values dont tie up with  diamond symbol on graph. below is the code, how should i automate if my values are either +ve or -ve .  here is the code.

 

%let name = test;
PROC FORMAT library=work;
picture pct0dec (round) low -< 0 = '00009%' (prefix='-')
0 - high = '00009%' (prefix='');

picture pct1dec (round) low -< 0 = '00009.9%' (prefix='-')
0 - high = '00009.9%' (prefix='');

picture pct2dec (round) low -< 0 = '00009.99%' (prefix='-')
0 - high = '00009.99%' (prefix='');

RUN;


data my_data1;
length mnm_color $10;
format count dollar10. value pct1dec.;
input mnm_color count value;
datalines;
Medical 45 -5.2
Cat 85 15.3
IP 65 12.8
OP 22 28.0
Prof 13 -3.6
Other 9 16.3
;
run;

proc sql noprint;
select max(int(value)) into: max_val from work.my_data1;
quit;
%put &max_val.;

data myanno_1; set my_data1;
length function color $8;
xsys='2'; when='a'; function='label';
midpoint=mnm_color;
ysys='1';
y=0; text=trim(left(put(count,dollar10.)));
color='green'; position='2';size=2;style='Regular'; output;
if value > 0 then do;
y=((value-1.0)/(30-1.0))*100 ;
text=trim(left(put(value,pct1dec.)));
color='white'; position='1'; size=2;style='Regular';CBOX='green';output;
end;
else if value = 0 then do;
y=(&max_val.+4)*2;
text=trim(left(put(value,pct1dec.)));
color='white'; position='1'; size=2;style='Regular';CBOX='green';output;
end;
else do;
y = (&max_val.+4)*2;
text=trim(left(put(value,pct1dec.)));
color='white'; position='6'; size=2;style='Regular';CBOX='green';output;
end;

run;

 

/*options linesize=MAX pagesize=MAX;*/
goptions reset=all noborder cback=white htitle=12pt htext=10pt imagestyle= vsize=5in;
goptions xpixels=525 ypixels=400;
goptions border;

ODS LISTING CLOSE;
ODS HTML path='physicalpath' body="&name..htm" style=htmlblue
gpath='physicalpath/Test.jpg';

goptions ftitle="albany amt/bold" ftext="albany amt/bold"
gunit=pct ;
/*htitle=5.0 htext=3.2 ctext=gray33;*/


axis1 value=(angle=360 rotate=0) label=none ;
axis2 label=(angle=90 "Per Member Per Year Spend") value=none ;/*order=(0 to 1100000 by 100000);*/
axis3 label=(angle=90 "Trend%") label=none value=none order=(-32 to 32 by 2); /*order=(-20 to 20 by 2)*/
symbol1 interpol=none value=diamondfilled color='#F79646' height=6 ;
pattern1 v=solid color='#0049AE';


proc gbarline data= my_data1;
/*symbol font= value=diamondfilled co=mob HEIGHT=5 interpol=none ;*/
bar mnm_color / sumvar=count maxis=axis1 raxis=axis2 NOFRAME Noheading
midpoints="Medical" "Cat" "IP" "OP" "Prof" "Other" width=16 noaxis anno=myanno_1 ; /*anno=myanno*/
plot / sumvar=value raxis=axis3 ;
run;
quit;

ODS HTML CLOSE;
ODS LISTING;

1 ACCEPTED SOLUTION

Accepted Solutions
9 REPLIES 9
ballardw
Super User

Without data to plot (the actual data not the annotate) or a picture of the result it isn't quite clear what your issue is.

 

I do know that I would strongly suggest looking at Proc SGPlot with Vbar and Vline statements as Gbarline is pretty limited to the main display.

pmksasbi
Fluorite | Level 6

data my_data1; length mnm_color $10; format count dollar10. value pct1dec.; input mnm_color count value; datalines; Medical 45 -5.2 Cat 85 15.3 IP 65 12.8 OP 22 28.0 Prof 13 -3.6 Other 9 16.3 ; run;

 

this is the sample data i am using.

ballardw
Super User

@pmksasbi wrote:

data my_data1; length mnm_color $10; format count dollar10. value pct1dec.; input mnm_color count value; datalines; Medical 45 -5.2 Cat 85 15.3 IP 65 12.8 OP 22 28.0 Prof 13 -3.6 Other 9 16.3 ; run;

 

this is the sample data i am using.


And you have a good example why code and log results should be pasted into a code box using the forum {i} icon.

ballardw
Super User

I get an error from this line:

symbol1 interpol=none value=diamondfilled color='#F79646' height=6 ;

 

At least in my install diamondfilled is not acceptable for SYBMOL statement value and generates an error.

pmksasbi
Fluorite | Level 6
Can you please use circle
Thanks

##- Please type your reply above this line. Simple formatting, no
attachments. -##
ballardw
Super User

I'm not sure about your calculations for the y offset for the annotation.

I know the below doesn't fit all of your need but you might consider this as a different starting point.

proc sgplot data=work.my_data1 noautolegend ;
   vbar mnm_color /response=count datalabel Fillattrs=(color='cx0049AE');
   vline mnm_color/response=value y2axis datalabel name='vline'
      markers markerattrs=(color='cxF79646' size=10pt symbol=diamondfilled)
      lineattrs=(thickness=0)
   ;
   yaxis label="Per Member Per Year Spend" ;
   y2axis label= 'Trend%' ;
run; 

There are additional text options, axis options and attrmap dataset that may help.

 

pmksasbi
Fluorite | Level 6

Thanks for the reply. I have Javav error's. i will have to check with my system admin. If possible can you please attach the output. i am just curious to see how the output looks. Thanks

 

ERROR: The Java proxy is not responding.
ERROR: Unable to load the Java Virtual Machine. Please see the installation
instructions or system administrator.
ERROR: Unable to load the Java Virtual Machine. Please see the installation
instructions or system administrator.
ERROR: The Java child process terminated unexpectedly: status 255.
ERROR: WIFSIGNALED 0 WIFEXITED 0 WEXITSTATUS -1 WTERMSIG -1.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: There were 6 observations read from the data set WORK.MY_DATA1.
NOTE: Remote submit to ATLAS complete.

ballardw
Super User

SGPlot.png

 

I didn't use many options.

pmksasbi
Fluorite | Level 6

Thanks

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
  • 9 replies
  • 2874 views
  • 1 like
  • 2 in conversation