R ggplot2 autoplot() 函数。怎么了?
R ggplot2 autoplot() function. What's wrong?
我有一个包含 2285 个观测值的数据集 "bc",两个变量:"Date" 和 "Price"。
'data.frame': 2285 obs. of 2 variables:
$ Date : Date, format: "2017-12-14" "2017-12-13" ...
$ Price: num 16234 16250 16650 16470 14691 ...
我尝试创建一个时间序列对象:
tsbc <- ts(bc)
然后,我使用了:
autoplot(tsbc)
我得到下图:
然而,剧情并不是它应该的样子。你能帮我理解为什么吗?
这是一个基于xts
的解决方案:
library(ggplot2)
# Generate a dataset
set.seed(1)
bc <- data.frame(Date=seq(as.Date("2016/1/1"), as.Date("2017/12/14"), "days"),
Price= cumsum(rnorm(714)))
# 'data.frame': 714 obs. of 2 variables:
# $ Date : Date, format: "2016-01-01" "2016-01-02" ...
# $ Price: num -0.626 -0.443 -1.278 0.317 0.646 ...
library(xts)
tsbc <- xts(bc$Price, order.by=bc$Date)
autoplot(tsbc)
否则,使用ts
:
tsbc <- ts(bc$Price, start=c(2016,1), frequency=365)
autoplot(tsbc) + scale_x_yearmon(n=5)
问题在于您如何创建该时间序列对象 tsbc
。您实际上是在创建两个时间序列。由于日期只是具有 class 属性的数字,因此当您调用 ts
时它们将失去其属性。这就是为什么 autoplot
也为 Date
绘制了一条线,并绘制了代表相应日期的双精度值(有关详细信息,请参阅 ?base::Dates
)。这显然不是你想要的。有关如何构造 ts
对象的信息,请参见@Marco 的回答。
但是,您甚至不需要这样做。为什么不干脆
library(ggplot2)
ggplot(bc, aes(Date, Price)) + geom_line()
我有一个包含 2285 个观测值的数据集 "bc",两个变量:"Date" 和 "Price"。
'data.frame': 2285 obs. of 2 variables:
$ Date : Date, format: "2017-12-14" "2017-12-13" ...
$ Price: num 16234 16250 16650 16470 14691 ...
我尝试创建一个时间序列对象:
tsbc <- ts(bc)
然后,我使用了:
autoplot(tsbc)
我得到下图:
这是一个基于xts
的解决方案:
library(ggplot2)
# Generate a dataset
set.seed(1)
bc <- data.frame(Date=seq(as.Date("2016/1/1"), as.Date("2017/12/14"), "days"),
Price= cumsum(rnorm(714)))
# 'data.frame': 714 obs. of 2 variables:
# $ Date : Date, format: "2016-01-01" "2016-01-02" ...
# $ Price: num -0.626 -0.443 -1.278 0.317 0.646 ...
library(xts)
tsbc <- xts(bc$Price, order.by=bc$Date)
autoplot(tsbc)
否则,使用ts
:
tsbc <- ts(bc$Price, start=c(2016,1), frequency=365)
autoplot(tsbc) + scale_x_yearmon(n=5)
问题在于您如何创建该时间序列对象 tsbc
。您实际上是在创建两个时间序列。由于日期只是具有 class 属性的数字,因此当您调用 ts
时它们将失去其属性。这就是为什么 autoplot
也为 Date
绘制了一条线,并绘制了代表相应日期的双精度值(有关详细信息,请参阅 ?base::Dates
)。这显然不是你想要的。有关如何构造 ts
对象的信息,请参见@Marco 的回答。
但是,您甚至不需要这样做。为什么不干脆
library(ggplot2)
ggplot(bc, aes(Date, Price)) + geom_line()