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

Using SAS 9.4

 

I am trying the code below to overlay a line on a bar graph:

proc format;
value impng_cat 0 - 19.99 = '0-19'
20 - 39.99 = '20-39'
40 - 59.99 = '40-59'
60 - 79.99 = '60-79'
80 - 99.99 = '80-99'
100 - 119.99 = '100-119'
120 - 139.99 = '120-139';
run;

proc sgplot data= check;
format impingment_point impng_cat.;
vbar impingment_point;
vline cum_pct;
xaxis label= '';
yaxis values=(0 5 10 15 20 25 30 35 40 45) label= 'Number of Patients';
label cum_pct = 'Cumulative Percent';
run;

 

However, I get the following error when I run the code:

"ERROR: The same category variable must be used for summarized plots."

 

Example of data:

data have;
input id impingment_point cum_pct delimiter= ',';
datalines;
1, 33, 2
2, 120, 100
3, 80, 80
4, 60, 59
5, 45, 19
;

 

Ideally, I would like

1. bar graph with a line of the cummulative percentage

2. Also, is it possible to show a category with 0 data point on a bar graph? The first category of 0-19.99 has 0 observations but I would like to be able to show this on the bar graph as well.

 

Thank you for any thoughts or suggestions

1 ACCEPTED SOLUTION

Accepted Solutions
PeterClemmensen
Tourmaline | Level 20

I'm still not sure I understand the structure of your data. However, I think you can use this as a template. It definitely contains all the building blocks to answer both question 1 and two.

 

Feel free to ask.

 

data have;
input id impingment_point cum_pct;
infile datalines dlm = ',';
datalines;
1, 33, 2
2, 120, 100
3, 80, 80
4, 60, 59
5, 45, 19
;

proc format;
value impng_cat 
0 - 19.99 = '0-19'
20 - 39.99 = '20-39'
40 - 59.99 = '40-59'
60 - 79.99 = '60-79'
80 - 99.99 = '80-99'
100 - 119.99 = '100-119'
120 - 139.99 = '120-139';
run;

proc summary data=have nway completetypes;
   class impingment_point / preloadfmt missing;
   format impingment_point impng_cat.;
   output out=temp;
run;

data plot;
   do until (z1);
      set temp end = z1;
      s + _FREQ_;
   end;
   do until (z2);
      set temp end = z2;
      c = _FREQ_ / s;
      cc + c;
      output;
   end;
run;

proc sgplot data=plot;
   vbarparm category = impingment_point response = _FREQ_ / nozerobars;
   series x = impingment_point y = cc / y2axis;
   format impingment_point impng_cat. cc percent.;
run;

View solution in original post

7 REPLIES 7
DavidHD
SAS Employee

Hey @GS2 ,

 

is this what you are looking for?

data have;
infile datalines delimiter=',';
input id impingment_point cum_pct;
datalines;
1,33,2
2,120,100
3,80,80
4,60,59
5,45,19
;
run;

proc format;
value impng_cat 0 - 19.99 = '0-19'
20 - 39.99 = '20-39'
40 - 59.99 = '40-59'
60 - 79.99 = '60-79'
80 - 99.99 = '80-99'
100 - 119.99 = '100-119'
120 - 139.99 = '120-139';
run;

proc sgplot data= have;
format impingment_point impng_cat.;
vbar impingment_point;
vline impingment_point / response=cum_pct y2axis;
xaxis label= '' type=discrete;
yaxis values=(0 5 10 15 20 25 30 35 40 45) label= 'Number of Patients';
label cum_pct = 'Cumulative Percent';
run;

For posting code in the future please use the Insert SAS Code Button in the editor.

 

For the display of a bar without any values I have no solution other than to add a row per missing value, not ideal I know but maybe color the missing value bar with something like mentioned here: https://communities.sas.com/t5/Graphics-Programming/How-to-make-a-bar-chart-and-assign-the-bar-color...

 

Hope this helps and kind regards

David

GS2
Obsidian | Level 7 GS2
Obsidian | Level 7
Thank you for the help but this isn't exactly what I want. I tried this previously and this provides the percentage for each column so the line moves up and down. I would like a cumulative percentage line, in other words a line that goes up the entire graph from 0 to 100%
PeterClemmensen
Tourmaline | Level 20

Can you provide an outline of what your desired graph looks like? Makes the whole thing easier.

GS2
Obsidian | Level 7 GS2
Obsidian | Level 7

Attached is what excel can do in a PDF but with example data

PeterClemmensen
Tourmaline | Level 20

This plot does not have anything to do with the sample data you posted, correct? Can you post the data behind this plot?

GS2
Obsidian | Level 7 GS2
Obsidian | Level 7
The plot is just an example of how I want the graph to look in the end. It is the same as type data as I post originally, just applying a format to the numbers
PeterClemmensen
Tourmaline | Level 20

I'm still not sure I understand the structure of your data. However, I think you can use this as a template. It definitely contains all the building blocks to answer both question 1 and two.

 

Feel free to ask.

 

data have;
input id impingment_point cum_pct;
infile datalines dlm = ',';
datalines;
1, 33, 2
2, 120, 100
3, 80, 80
4, 60, 59
5, 45, 19
;

proc format;
value impng_cat 
0 - 19.99 = '0-19'
20 - 39.99 = '20-39'
40 - 59.99 = '40-59'
60 - 79.99 = '60-79'
80 - 99.99 = '80-99'
100 - 119.99 = '100-119'
120 - 139.99 = '120-139';
run;

proc summary data=have nway completetypes;
   class impingment_point / preloadfmt missing;
   format impingment_point impng_cat.;
   output out=temp;
run;

data plot;
   do until (z1);
      set temp end = z1;
      s + _FREQ_;
   end;
   do until (z2);
      set temp end = z2;
      c = _FREQ_ / s;
      cc + c;
      output;
   end;
run;

proc sgplot data=plot;
   vbarparm category = impingment_point response = _FREQ_ / nozerobars;
   series x = impingment_point y = cc / y2axis;
   format impingment_point impng_cat. cc percent.;
run;

sas-innovate-wordmark-2025-midnight.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.


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
  • 7 replies
  • 1934 views
  • 1 like
  • 3 in conversation