pfa*_*bri 5 timezone timestamp r time-series ggplot2
我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
这很好用:
g <- ggplot(interval.steps, aes(interval, mean))
g + geom_line()
Run Code Online (Sandbox Code Playgroud)
但这不是:
g <- ggplot(interval.steps, aes(interval, mean))
g + geom_line() +
scale_x_datetime(date_labels = '%H:%M') # offsets times by -2 hours
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?提前致谢.
看起来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())
Run Code Online (Sandbox Code Playgroud)
上面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)
}
Run Code Online (Sandbox Code Playgroud)
此方法的优点是无论原始变量的时区参数和当前语言环境如何,它都可以工作。
例如,如果您的时间值是通过以下方式读取的:as.POSIXct(interval, format = '%H:%M', tz = 'Pacific/Honolulu'),则即使您位于津巴布韦,该图表仍将使用正确的 X 轴标签绘制。