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: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

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
  • 2561 views
  • 1 like
  • 2 in conversation