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 2025: Call for Content

Are you ready for the spotlight? We're accepting content ideas for SAS Innovate 2025 to be held May 6-9 in Orlando, FL. The call is open until September 25. Read more here about why you should contribute and what is in it for you!

Submit your idea!

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

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

View all other training opportunities.

Discussion stats
  • 7 replies
  • 1485 views
  • 1 like
  • 3 in conversation