BookmarkSubscribeRSS Feed
Quartz | Level 8 n6
Quartz | Level 8

I have cigarette smoking data along with a continuous variable of interest.  I compute how many cigs were smoked in the last 15, 30 and 60 minutes before the measure was taken.  It turns out the the number of cigs smoked in the last 15 minutes is 0, 1 or 2, in the last 30 minuts is 0, 1, 2 or 3 and in the last 60 minutes is 0, 1, 2, 3, 4 or 5.  Okay, that's all fine.


Then what I want to do is make a vertical bar chart.  On the y-axis is the mean measure of interest and on the x-axis is separate bars for the number of cigs smoked.  I'm using PROC GCHART.  When I do it for 15 minutes it works fine and vertical bars at 0, 1 and 2 show up.  When I do it for 60 minutes it works fine and vertical bars for 0, 1, 2, 3, 4 and 5 show up.  Okay, still fine.


But when I do it for 30 minutes, instead of getting vertical bars at 0, 1, 2 and 3 as I should, I get vertical bars at only 0 and 3.  (As an aside, although it works for 15 and 60 minutes, the x-axis ticks don't say 0, 1, 2, etc and instead say 0.0, 1.0, 2.0, etc.  Maybe that's a clue in all this.)


In an AXIS statement my code has the line


order = 0 to 5 by 1;


But the bars for 1 and 2 don't show up.  (Or if I change 5 to 3 then the same thing happens.)


Then I tried order = 0 to 5 by 0.1 and still the bars for 1 and 2 didn't show up.


Then I tried 0 to 5 by 0.01 and the bars for 1 and 2 DID show up.  It's all squished together because I have so many points on the x-axis so I can't tell exactly where they're at, be it 1.99 or 2.01 or whatever, but the bars at (or close to) 1 and 2 are there.


Why is this?  I want to use 0 to 5 by 1 (or maybe 0 to 3 by 1) and have bars at 0, 1, 2 and 3, but I can't seem to accomplish this, I guess because SAS somehow thinks the value aren't exactly 1 and 2.


I did a PROC FREQ with a format 30.28, to see 28 numbers to the right of the decimal for 0, 1, 2 and 3 and every single number to the right of the decimal is 0, e.g., it's 2.0000000000000000000000000000 rather than something else.


Any ideas?  When I created these numbers I set a counter to 0 and then if a person smoked I cig I incremented the counter by 1 so I don't see how the values can be anything other than exactly 0, 1, 2 or 3.


Any info is appreciated.



Mystified in Chapel Hill

Super User
We'd need to see the code, possible output and/or some sample data.
Super User

The values displayed on the X axis are related to the Format of the variable. Add Format Xvariablename f1.0; to the Gchart code and you should see 0, 1, 2 instead of the decimal versions.


Since your X variable is calculated it  you may need to ROUND the value to an integer before graphing it.

Quartz | Level 8 n6
Quartz | Level 8

The format thing did change 1.0, 2.0, etc to 1, 2, etc.  I've never put a format in a PROC GCHART before and I never had this problem so I'm guessing that the root problem is that the numbers are not exactly 1, 2, etc as I thought they were.  If they were exactly 1, 2, etc then I assume I wouldn't SAS woudln't think about decimal places.  So I guess my problem is the numbers aren't exact integers.


I realize the internal storage of the computer is a whole other mystery world so even though the numbers appear as 1, 2, etc on my screen maybe they're not stored internally that way  I assign X = 0 and then if an event occurs I do X = X + 1 so it seems like X should always be an integer but I guess not.  When I created all this it was in a big macro that ran many times in a big loop so maybe a shortage of memory or something forced SAS to use shortcuts in memory.


I did just now create a rounded variable like


Z = round (Y)


where Y was the original variable and then I ran PROC GCHART on Z and I still got no bars at 1 and 2.


Here is the code in case that helps.  I'm about to leave for home but I am going to e-mail this to myself and then work on it at home later tonight.

%MACRO PLOT (el, min);
proc sort data=plot_⪙ by z ; run;
proc means data=plot_&EL n mean stderr; by z ; var eCO; run;
axis1 label = ('Number of Cigs ' "&EL" ' in Previous ' "&MIN" ' Minutes')
order = 0 to 5 by 1;
axis2 label = ('eCO')
order = 0 to 40 by 10;
proc gchart data=plot_⪙
vbar z /
type = mean
sumvar = eCO
errorbar = both
maxis = axis1
raxis = axis2

Super User

Can you provide an example data set with the variables involved in the plot that shows this issue?


Minor style point: You are making this line more complicated than needed:

axis1 label = ('Number of Cigs ' "&EL" ' in Previous ' "&MIN" ' Minutes')



axis1 label = ("Number of Cigs &EL in Previous &MIN Minutes")


Breaking up the pieces of a label is really only needed if you are applying different text characteristics for different bits of the title.



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
  • 4 replies
  • 3 in conversation