armipunk
armipunk

Reputation: 458

How to define day from 6am to 6am on x axis in ggplot?

I am trying to do a bar chart of an aggregate, by the hour.

hourly <- data.frame(
  hour = 0:23,
  N = 7+0:23,
  hour.mod = c(18:23, 0:17))

The day is from 6am to 6am, so I added an offset, hour.mod, and then:

ggplot(hourly, aes(x = hour.mod, y = N)) +
  geom_col() +
  labs(x = "6am to 6am", y = "Count") 

Except, the x-axis scale at 0 contradicts the label. While tinkering with scales: scale_x_discrete(breaks = c(6, 10, 14, 18, 22)) disappeared the scale altogether; which works for now but sub-optimal.

How do I specify x axis to start at an hour other than 0 or 23? Is there way to do so without creating an offset column? I am a novice, so please assume you are explaining to the village idiot.

Upvotes: 1

Views: 174

Answers (1)

IRTFM
IRTFM

Reputation: 263451

You don't say what you want to see, but it's fairly clear that you should be using scale_x_continuous and shifting your labels somehow, either "by hand" or with some simple math:

ggplot(hourly, aes(x = hour.mod, y = N)) +
   geom_col() +
   labs(x = "6am to 6am", y = "Count") + 
   scale_x_continuous(breaks= c(0,4,8,12,16), labels = c(6, 10, 14, 18, 22) )

Or perhaps:

ggplot(hourly, aes(x = hour.mod, y = N)) +
   geom_col() +
   labs(x = "6am to 6am", y = "Count") + 
   scale_x_continuous(breaks= c(6, 10, 14, 18, 22)-6, # shifts all values lower
                     labels = c(6, 10, 14, 18, 22) )

It's possible you need to use modulo arithmetic, which in R involves the use of %% and %/%:

1:24 %% 12
 [1]  1  2  3  4  5  6  7  8  9 10 11  0  1  2  3  4  5  6  7  8  9 10 11  0

Upvotes: 2

Related Questions