Reputation: 2017
I have a number of times and want to plot the frequency of each time in a barplot
library(ggplot2)
library(chron)
test <- data.frame(times = c(rep("7:00:00",4), rep("8:00:00",3),
rep("12:00:00",1), rep("13:00:00",5)))
test$times <- times(test$times)
test
times
1 07:00:00
2 07:00:00
3 07:00:00
4 07:00:00
5 08:00:00
6 08:00:00
7 08:00:00
8 12:00:00
9 13:00:00
10 13:00:00
11 13:00:00
12 13:00:00
13 13:00:00
The value of binwidth
is chosen to represent minutes
p <- ggplot(test, aes(x = times)) + geom_bar(binwidth=1/24/60)
p + scale_x_chron(format="%H:%M")
As you see the scales are plus one hour in the x-axis:
I have the feeling that is has something to do with the timezone, but I cant really place it:
Sys.timezone()
[1] "CET"
Edit: Thanks @shadow for comment
UPDATE:
If I run Sys.setenv(TZ='GMT')
first it works perfectly. The problem is in the times()
function. I automatically sets the timezone to GMT
and if I'm plotting the x-axis, ggplot notices that my system-timezone is CET
and adds one hour on the plot.
Now if i'm setting my system-timezone to GMT
, ggplot doesn't add an hour.
Upvotes: 6
Views: 3276
Reputation: 59355
The problem is that times(...)
assumes the timezone is GMT, and then ggplot
compensates for your actual timezone. This is fair enough: times are meaningless unless you specify timezone. The bigger problem is that it does not seem possible to tell times(...)
what the actual timezone is (if someone else knows how to do this I'd love to know).
A workaround is to use POSIXct and identify your timezone (mine is EST).
test <- data.frame(times = c(rep("7:00:00",4), rep("8:00:00",3),
rep("12:00:00",1), rep("13:00:00",5)))
test$times <- as.POSIXct(test$times,format="%H:%M:%S",tz="EST")
p <- ggplot(test, aes(x = times)) + geom_bar(binwidth=60,width=.01)
binwidth=60
is 60 seconds.
Upvotes: 6
Reputation: 22293
It has nothing to do with timeszone, the only problem is that in format
, %m
represents the month and %M
represents the minute. So the following will work
p + scale_x_chron(format="%H:%M")
Upvotes: 2