R中几只股票的多个时间序列图将返回错误

问题描述

我有多个股票的时间序列数据。我想将它们绘制在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

我想要类似以下情节:

here

解决方法

尽管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")

enter image description here

,

原始代码中的错误消息是由于以下事实造成的:传递给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()DateClose作为x和y变量,使用facet_grid()Symbol来生成构面。

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

...以及初始输出:

enter image description here

生成图表后,我们将进行一些调整以清理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")

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

enter image description here

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...