90

I'm having a very, very tough time getting the x-axis to look correct for my graphs.

Here is my data:

df <- data.frame(
  Month = factor(c(
    "2011-07-31", "2011-08-31", "2011-09-30", "2011-10-31", "2011-11-30",
    "2011-12-31", "2012-01-31", "2012-02-29", "2012-03-31", "2012-04-30",
    "2012-05-31", "2012-06-30"
  )),
  AvgVisits = c(
    6.98655104580674, 7.66045407330464, 7.69761337479304, 7.54387561322994,
    7.24483848458728, 6.32001400498928, 6.66794871794872, 7.207780853854,
    7.60281201431308, 6.70113837397123, 6.57634103019538, 6.75321935568936
  )
)

Here is the chart I am trying to graph:

ggplot(df, aes(x = Month, y = AvgVisits)) + 
  geom_bar() +
  theme_bw() +
  labs(x = "Month", y = "Average Visits per User")

That chart works fine - but, if I want to adjust the formatting of the date, I believe I should add this: scale_x_date(labels = date_format("%m-%Y"))

I'm trying to make it so the date labels are 'MMM-YYYY'

ggplot(df, aes(x = Month, y = AvgVisits)) + 
  geom_bar() +
  theme_bw() +
  labs(x = "Month", y = "Average Visits per User") +
  scale_x_date(labels = date_format("%m-%Y"))

When I plot that, I continue to get this error:

stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.

Despite hours of research on formatting of geom_line and geom_bar, I can't fix it. Can anyone explain what I'm doing wrong?

Edit: As a follow-up thought: Can you use date as a factor, or should you use as.Date on a date column?

2
  • Have you loaded library(scales)? Commented Jul 31, 2012 at 20:31
  • @smillig yes - scales is loaded. Commented Jul 31, 2012 at 20:32

2 Answers 2

146

To show months as Jan 2017 Feb 2017 etc:

scale_x_date(date_breaks = "1 month", date_labels =  "%b %Y") 

Angle the dates if they take up too much space:

theme(axis.text.x=element_text(angle=60, hjust=1))
Sign up to request clarification or add additional context in comments.

8 Comments

almost went crazy, trying to figure out why this wouldn't work. Figured out, theme_bw() overwrites anything theme() does. Reordered, and it works just fine. Leaving it here in case, someone is having the same issue.
Appreciate your answer, this helps me, write down my words to show my appreciation
This should definitely be the accepted answer to this question. The other one requires you to have the "Scales" library installed and loaded, whereas this one uses functionally that already exists in ggplot2.
@stevec that is true for most programming languages. It's more important here that theme_bw() overwrites other theme() configurations, which could be confusing. It's only tangently related to this answer.
@AmphotericLewisAcid ggplot2 imports scales, so if someone is using ggplot, they've already got scales installed
|
91

Can you use date as a factor?

Yes, but you probably shouldn't.

...or should you use as.Date on a date column?

Yes.

Which leads us to this:

library(scales)
df$Month <- as.Date(df$Month)
ggplot(df, aes(x = Month, y = AvgVisits)) + 
  geom_bar(stat = "identity") +
  theme_bw() +
  labs(x = "Month", y = "Average Visits per User") +
  scale_x_date(labels = date_format("%m-%Y"))

enter image description here

in which I've added stat = "identity" to your geom_bar call.

In addition, the message about the binwidth wasn't an error. An error will actually say "Error" in it, and similarly a warning will always say "Warning" in it. Otherwise it's just a message.

6 Comments

Spot on. Thanks. I hadn't seen stat = "identity" before. Going to research that more now. Thanks.
@mikebmassey The basic thing to remember with stat = "identity" is that if you're doing bar plots and you've already aggregated the data so you have the heights of each bar already, then use it.
Follow-up related to a line chart for this: so this is only applicable to bar plots - I just tried to plug the same thing with a geom_line - with and without stat = "identity" - I get this warning `geom_path: Each group consist of only one observation. If I only have 1 data group, why would I need to group to make it work? Thanks
Error in date_format("%m-%Y") : could not find function "date_format"
@Peyman you need library(scales) for date_format
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.