使用facet_grid / ggplot2将时间序列数据移动一天

时间:2015-12-02 17:11:35

标签: r date datetime ggplot2 time-series

我正在使用facet_grid绘制我的时间序列数据。数据是

> dput(mel.ob)
structure(list(timestamp = structure(c(1438450200, 1438536600, 
1438623000, 1438709400, 1438795800, 1438882200, 1438968600, 1439055000, 
1439141400, 1439227800, 1439314200, 1439400600, 1439487000, 1439573400, 
1439659800, 1439746200, 1439832600, 1439919000, 1440005400, 1440091800, 
1440178200, 1440264600, 1440351000, 1440437400, 1440523800, 1440610200, 
1440696600, 1440783000, 1440869400, 1440955800, 1438450200, 1438536600, 
1438623000, 1438709400, 1438795800, 1438882200, 1438968600, 1439055000, 
1439141400, 1439227800, 1439314200, 1439400600, 1439487000, 1439573400, 
1439659800, 1439746200, 1439832600, 1439919000, 1440005400, 1440091800, 
1440178200, 1440264600, 1440351000, 1440437400, 1440523800, 1440610200, 
1440696600, 1440783000, 1440869400, 1440955800, 1438450200, 1438536600, 
1438623000, 1438709400, 1438795800, 1438882200, 1438968600, 1439055000, 
1439141400, 1439227800, 1439314200, 1439400600, 1439487000, 1439573400, 
1439659800, 1439746200, 1439832600, 1439919000, 1440005400, 1440091800, 
1440178200, 1440264600, 1440351000, 1440437400, 1440523800, 1440610200, 
1440696600, 1440783000, 1440869400, 1440955800), tzone = "Asia/Kolkata", tclass = c("POSIXct", 
"POSIXt"), class = c("POSIXct", "POSIXt")), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("power", "hpanom", 
"lofanom"), class = "factor"), value = c(172.016104060554, 176.777480085691, 
184.018404140075, 175.561151940955, 182.52419107159, 175.216664665937, 
183.751597162088, 198.844153259955, 199.803173963254, 237.508030500042, 
285.079349749013, 188.377162014776, 452.238984323895, 304.084650686052, 
304.976941431231, 168.37194477982, 221.142072661718, 285.339264474312, 
243.126828978721, 526.165040140682, 583.26909929249, 549.145660841621, 
195.02748863608, 200.088289825199, 249.279407493724, 410.968041439378, 
368.949028046264, 361.528117646774, 394.092273548577, 439.027137154341, 
0.190453461153838, 0.738170304350057, 0.359277651161948, 0.383363598976019, 
0.357189854750563, 0.357189854750563, 0, 0.464407941461156, 0.842226206120729, 
0.928056670115148, 0.939184368487052, 0.174074829364281, 0.999333003990622, 
0.97052094947291, 0.957985395010343, 0.620128340774666, 0.971218262867733, 
0.918581736843709, 0.898790693128374, 0.992626480647862, 0.996099376857962, 
0.995219939905799, 0.864283999224187, 0.903098686478643, 0.929581519648184, 
0.98981186152571, 0.986686711459769, 0.989957071504958, 0.984688509451126, 
0.986320878558335, 0.02, 0.1, 0.03, 0.02, 0.07, 0.02, 0, 0.04, 
0.05, 0.45, 0.11, 0.01, 1, 0.1, 0.13, 0.03, 0.72, 0.13, 0.59, 
0.54, 0.72, 0.52, 0.08, 0.07, 0.14, 0.2, 0.15, 0.15, 0.17, 0.18
)), row.names = c(NA, -90L), .Names = c("timestamp", "variable", 
"value"), class = "data.frame")

我正在使用以下代码进行绘图

f <- ggplot(data=mel.ob,aes(x=timestamp,y=value,ymin=0,ymax=value))+facet_grid(variable~., scales = "free_y")+
  theme(axis.title.x=element_blank(),axis.title.y=element_blank())
f1 <- f + geom_linerange(subset=.(variable=="hpanom"))  # require(plyr) for dot function
f2 <- f1 + geom_linerange(subset=.(variable=="lofanom"))  
f3 <- f2 + geom_line(subset=.(variable=="power")) 
f3

在绘图时我会得到以下情节 enter image description here

所以问题是我的数据集包含8月1日至8月30日的数据,但该图显示了8月2日至8月31日的数据。为什么以及如何将我的数据集移动一天?我在哪里做错了?

1 个答案:

答案 0 :(得分:4)

情节实际上并没有改变您的日期。您的日期是POSIXct格式,包括小时,分钟和秒。 ggplot2将每个点放在每个日期的确切时/分/秒。你所有的时间都是23个小时。因此,看起来像8月3日那样的线路实际上是8月2日的第23个小时。同样,最左边的一行是在8月1日的第23个小时。

如果展开图形的水平范围并仔细观察,您会看到主要网格线上的垂直线每条都略微(即1小时)移动到主要网格线的左侧,每天午夜。

您可以在代码中使用as.Date(timestamp)按天绘制点数(不考虑小时数)。另一种选择是保持日期/时间格式,但将主要网格线准确放置在您想要的位置。例如,以下是从8月1日23:00开始每周放置网格线的方法,但是将标签设置为没有时间的日期:

f3 + scale_x_datetime(breaks=seq(min(mel.ob$timestamp), max(mel.ob$timestamp), 
                                 by="1 week"),
                      labels=as.Date(seq(min(mel.ob$timestamp), max(mel.ob$timestamp), 
                                     by="1 week")))

作为附加说明,R中的日期/时间格式实际上只是添加了日期/时间类的数字变量。类POSIXct是自1970年1月1日00:00:00(在UTC时区)以来的秒数,而类Date是自1970年1月1日以来的天数。 ggplot正在绘制这些数值,但使用适合相应日期类的中断和标签。您可以通过执行as.numeric(mel.ob$timestamp)as.numeric(as.Date(mel.ob$timestamp))来查看基础数值。