我想在预测过程中制作带有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轴的第二个片段中,日期不会出现。这有什么不对?
提前谢谢。
答案 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
。)