问题描述
我有多个股票的时间序列数据。我想将它们绘制在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
。
- 情节缺失
variable
- 第1层缺少
variable
我想要类似以下情节:
解决方法
尽管Len Greski's answer有一个很好的解释和解决方案,但我认为我会以更“标准”的方法提供答案。也许某些用户会发现它更简单。
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")
,
原始代码中的错误消息是由于以下事实造成的:传递给variable
的数据中没有名为qplot()
的列。另外,为了生成所需的图表,我们需要从xts
生成的quantmod
对象中提取日期,以便将它们用作图表中的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',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,group = Symbol) +
facet_grid(Symbol ~ .,scale = "free_y")
...以及初始输出:
生成图表后,我们将进行一些调整以清理x轴标签。在默认图表上,它们是难以理解的,因为有251个不同的字符值,我们需要重新调整轴的比例以打印更少的标签。
首先,我们用as.Date()
转换基于字符的日期。其次,我们使用ggeasy
包来调整x轴上的内容。
stocks = lapply(symbols,"Adjusted")
aStock$Symbol <- symbol
aStock$Date <- as.Date(rownames(aStock),"%Y-%m-%d")
aStock
})
stocksDf <- do.call(rbind,stocks)
library(ggeasy)
qplot(Date,scale = "free_y") +
scale_x_date(date_breaks = "14 days") +
easy_rotate_x_labels(angle = 45,side = "right")
...以及修改后的输出:
注意::要绘制调整后的收盘价,只需将qplot()
函数中的y变量更改为Adjusted
。