The time series chart is shifted by 2 hours if scale_x_datetime is used

Problem:

I am trying to build a time series with ggplot, but for some reason the data is shifted by two hours.

Data:

> test <- structure(list(interval = structure(c(1465423500, 1465423800, 
1465424100, 1465424400, 1465424700, 1465425000, 1465425300, 1465425600, 
1465425900, 1465426200, 1465426500, 1465426800, 1465427100), class = c("POSIXct", 
"POSIXt"), tzone = ""), mean = c(0.339622641509434, 0.132075471698113, 
0.150943396226415, 0.0754716981132075, 2.09433962264151, 0.528301886792453, 
0.867924528301887, 0, 1.47169811320755, 0.30188679245283, 0.132075471698113, 
0.320754716981132, 0.679245283018868)), .Names = c("interval", 
"mean"), class = c("tbl_df", "data.frame"), row.names = c(NA, 
-13L))

> test
    Source: local data frame [13 x 2]     

interval      mean     
(time)     (dbl)     
1  2016-06-09 00:05:00 0.3396226 # First value: 5 minutes past midnight    
2  2016-06-09 00:10:00 0.1320755     
3  2016-06-09 00:15:00 0.1509434     
4  2016-06-09 00:20:00 0.0754717     
5  2016-06-09 00:25:00 2.0943396     
6  2016-06-09 00:30:00 0.5283019     
7  2016-06-09 00:35:00 0.8679245     
8  2016-06-09 00:40:00 0.0000000     
9  2016-06-09 00:45:00 1.4716981     
10 2016-06-09 00:50:00 0.3018868     
11 2016-06-09 00:55:00 0.1320755     
12 2016-06-09 01:00:00 0.3207547     
13 2016-06-09 01:05:00 0.6792453

Example

This works great:

g <- ggplot(interval.steps, aes(interval, mean))
g + geom_line()

X-axis signs show actual data

But this is not so:

g <- ggplot(interval.steps, aes(interval, mean))
g + geom_line() +
    scale_x_datetime(date_labels = '%H:%M') # offsets times by -2 hours

enter image description here

Question

What am I doing wrong? Thanks in advance.

+4
source share
2 answers

Time Zone Independence

The Eipi10 answer above is a good way around a problem. However, I would like to avoid hard coding the time zone settings in my program, trying to make it reproducible in any locale. The way to achieve this is very simple, just leave the parameter tz:

# Generator function to create 'hh:mm' labels for the x axis
# without explicit 'tz' specification  
date_format <- function(format = "%H:%M") {

    function(x) format(x, format)
}

, .

, - : as.POSIXct(interval, format = '%H:%M', tz = 'Pacific/Honolulu'), - X, , , .

+2

, scale_x_datetime interval UTC. .

# Source: http://stackoverflow.com/a/11002253/496488
# Put in your local timezone. I've inserted mine just for illustration.
date_format_tz <- function(format = "%H:%M", tz = "America/Los_Angeles") {
  function(x) format(x, format, tz=tz)
}

g <- ggplot(interval.steps, aes(interval, mean))
g + geom_line() +
  scale_x_datetime(labels = date_format_tz())
+3

All Articles