原始代码中的错误消息是由于传递给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() 和Date 和Close 作为x 和y 变量,并使用facet_grid() 和Symbol 来生成构面。
qplot(Date, Close, data = stocksDf, geom = "line", group = Symbol) +
facet_grid(Symbol ~ ., scale = "free_y")
...和初始输出:
生成图表后,我们将进行一些调整以清理 x 轴标签。在默认图表上,它们难以理解,因为有 251 个不同的字符值,我们需要重新调整轴以打印更少的标签。
首先,我们将基于字符的日期转换为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。