R returns 中几只股票的多个时间序列图一个错误

Multiple time series plots for several stocks in R returns an error

我有一个包含多只股票的时间序列数据。我想将它们绘制在 R 中的一个图中。

我尝试了此网站中的现有答案,但出现错误。这是我的代码:

library(quantmod)
library(TSclust)
library(ggplot2)
# download financial data

symbols = c('ASX', 'AZN', 'BP', 'AAPL')
start = as.Date("2014-01-01")
until = as.Date("2014-12-31")

stocks = lapply(symbols, function(symbol) {
    Close = getSymbols(symbol,src='yahoo', from = start, to = until, auto.assign = FALSE)[, 6]
   names(adjust) = symbol
    adjust
  })

我从现有答案(来自 here)中尝试了以下内容

qplot(symbols, value, data = as.data.frame(stocks), geom = "line", group = variable) +
  facet_grid(variable ~ ., scale = "free_y")

我收到以下错误:

错误:至少一层必须包含所有分面变量:variable

我想要类似下面的情节:

原始代码中的错误消息是由于传递给qplot()的数据中没有名为variable的列引起的。此外,为了生成所需的图表,我们需要从 quantmod 生成的 xts 对象中提取日期,以便我们可以将它们用作图表中的 x 轴变量。

通过一些调整,将股票数据中的适当变量放入 qplot() 规范中,我们可以生成所需的图表。

我们修改读取股票列表的代码如下:

  • xts 对象转换为 data.frame
  • 类型的对象
  • 重命名列以消除股票代码,这样我们就可以在后续步骤中rbind()到单个数据框中
  • rownames()提取到数据框列

进行这些更改后,stocks 对象包含一个数据框列表,每个股票代码一个。

symbols = c('ASX', 'AZN', 'BP', 'AAPL')
start = as.Date("2014-01-01")
until = as.Date("2014-12-31")

stocks = lapply(symbols, function(symbol) {
     aStock = as.data.frame(getSymbols(symbol,src='yahoo', from = start, to = until, 
                         auto.assign = FALSE))
     colnames(aStock) <- c("Open","High","Low","Close","Volume","Adjusted")
     aStock$Symbol <- symbol
     aStock$Date <- rownames(aStock)
     aStock
})

接下来,我们使用 do.call()rbind() to combine the data into a single data frame that we'll use with qplot()`。

stocksDf <- do.call(rbind,stocks)

最后,我们使用 qplot()DateClose 作为 x 和 y 变量,并使用 facet_grid()Symbol 来生成刻面。

qplot(Date, Close, data = stocksDf, geom = "line", group = Symbol) +
     facet_grid(Symbol ~ ., scale = "free_y")

...和初始输出:

生成图表后,我们将进行一些调整以清理 x 轴标签。在默认图表上,它们难以理解,因为有 251 个不同的字符值,我们需要重新缩放轴以打印更少的标签。

首先,我们将 character-based 日期转换为 as.Date()。其次,我们使用ggeasy包来调整x轴上的内容。

stocks = lapply(symbols, function(symbol) {
     aStock = as.data.frame(getSymbols(symbol,src='yahoo', from = start, to = until, 
                         auto.assign = FALSE))
     colnames(aStock) <- c("Open","High","Low","Close","Volume","Adjusted")
     aStock$Symbol <- symbol
     aStock$Date <- as.Date(rownames(aStock),"%Y-%m-%d")
     aStock
})
stocksDf <- do.call(rbind,stocks)
library(ggeasy)
qplot(Date, Close, data = stocksDf, geom = "line", group = Symbol) +
     facet_grid(Symbol ~ ., scale = "free_y") +
     scale_x_date(date_breaks = "14 days") +
     easy_rotate_x_labels(angle = 45, side = "right")

...以及修改后的输出:

注意: 要绘制调整后收盘价图表,只需将 qplot() 函数中的 y 变量更改为 Adjusted

虽然 有很好的解释和解决方案,但我想我会用更 'standard' 的方法提供答案。也许有些用户会觉得更简单。

library(quantmod)
library(ggplot2)

symbols <- c("ASX", "AZN", "BP", "AAPL")
start <- as.Date("2014-01-01")
until <- as.Date("2014-12-31")

# import data into an environment
e <- new.env()
getSymbols(symbols, src = "yahoo", from = start, to = until, env = e)

# extract the adjusted close and merge into one xts object
stocks <- do.call(merge, lapply(e, Ad))

# Remove the ".Adjusted" suffix from each symbol column name
colnames(stocks) <- gsub(".Adjusted", "", colnames(stocks), fixed = TRUE)

# convert the xts object to a long data frame
stocks_df <- fortify(stocks, melt = TRUE)

# plot the data
qplot(Index, Value, data = stocks_df, geom = "line", group = Series) +
     facet_grid(Series ~ ., scale = "free_y")