正确的绘图日值格式

时间:2013-09-07 12:22:20

标签: r

我想在预测过程中制作带有x轴天数的图表。我使用这里的指南做了一个例子:https://stackoverflow.com/a/10347205/2366057

链接中的示例:

 Lines <- "Date        Used
 2011-11-1/00:00:00   587
 2011-11-2/01:00:00   578
 2011-11-3/02:00:00   600
 2011-11-4/03:00:00   599
 2011-11-5/04:00:00   678
 2011-11-6/05:00:00   555
 2011-11-7/06:00:00   650"

 dm <- read.table(text = Lines, header = TRUE)
 x = dm
require(lubridate)
library(forecast)
 y = ts(x$Used, start=c(2011, yday("2011-11-01")), frequency=365)
 fcast = forecast(ets(y), 10)
 plot(fcast, xaxt="n")
  a3 = strptime(x$Date, "%Y-%m-%d/%H:%M:%S")
 axis(1, at = decimal_date(a3), labels = format(a3, "%Y-%b-%d %H:%M:%S"), cex.axis=0.3, las=2)

我的数据:

"day","price"
"2010-02-12 00:00:00",12
"2010-02-12 01:00:00",14
"2010-02-12 02:00:00",15
"2010-02-12 03:00:00",14
"2010-02-12 04:00:00",13
"2010-02-12 05:00:00",16

我将数据存入csv文件,如上所述:

 df = read.csv(filepath, header=TRUE, sep=",")

 require(lubridate)
 library(forecast)
 y = ts(df$price)
 fcast = forecast(ets(y), 10)

 plot(fcast, xaxt="n")
 a3 = strptime(df$day, "%Y-%m-%d %H:%M:%S")
 axis(1, at = decimal_date(a3), labels = format(a3, "%Y-%b-%d %H:%M:%S"), cex.axis=0.6, las=2)

在x轴的第二个片段中,日期不会出现。这有什么不对?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

在您的第一个代码段中,请注意以下一行:

y = ts(x$Used, start=c(2011, yday("2011-11-01")), frequency=365)

使用实际观察的日期创建时间序列。这些日期的十进制表示存储在y中,用于绘制时间序列,当您稍后绘制轴并传入decimal_date(a3)时,事情会匹配。

unclass(y)
# [1] 587 578 600 599 678 555 650
# attr(,"tsp")
# [1] 2011.833 2011.849  365.000
decimal_date(a3)
# [1] 2011.833 2011.836 2011.838 2011.841 2011.844 2011.847 2011.850

看看数字是如何相似的?

但是你没有在第二个片段中包含这些日期:

y = ts(df$price)

所以观察结果只是绘制在1,2,3,4,5和6处。但是你再次传递decimal_date(a3) - 值离屏幕。

unclass(y)
# [1] 12 14 15 14 13 16
# attr(,"tsp")
# [1] 1 6 1
decimal_date(a3)
# [1] 2010.115 2010.115 2010.115 2010.115 2010.116 2010.116

但请注意其他内容:这些decimal_date值中的许多都是相同的。那是因为你在第二个片段中的观察结果相差几小时,而不是几天。这不是你想要的功能。

一种解决方法是在创建轴时坚持使用1-6编号:

axis(1, at = seq_along(a3), labels = format(a3, "%Y-%b-%d %H:%M:%S"), cex.axis=0.6, las=2)

另一种方法是在创建时间序列和绘制标签时将日期转换为秒:

df$day <- as.POSIXlt(df$day)

y = zoo(df$price, df$day)

axis(1, at = as.numeric(df$day), labels = format(a3, "%Y-%b-%d %H:%M:%S"), cex.axis=0.6, las=2)

(此时,您可能不应该将变量命名为day。)