Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ggplot2 and chron barplot of time data scale_x_chron

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:

enter image description here

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.

like image 632
schlusie Avatar asked Mar 13 '14 11:03

schlusie


1 Answers

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.

like image 136
jlhoward Avatar answered Oct 05 '22 23:10

jlhoward