如果使用scale_x_datetime时间序列图被2小时偏移如果使用scale_x_datetim

2019-05-12 08:48发布

问题:

我试图绘制与ggplot时间序列,但得到的数据通过两个小时某种原因所抵消。

数据:

> 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

这工作正常:

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

但这并不:

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

我究竟做错了什么? 提前致谢。

Answer 1:

它看起来像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())


Answer 2:

时区独立执行

上述Eipi10的回答是一个很好的解决方法。 不过,我想避免在试图使其在任何区域可再现硬编码时区设置成我的计划。 实现这一目标是非常简单的方式,只是离开了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轴绘制标签,即使你在,说,津巴布韦。



文章来源: Time series plot gets offset by 2 hours if scale_x_datetime is used