【问题标题】:Multiple time series plots for several stocks in R returns an errorR 中多只股票的多个时间序列图返回错误
【发布时间】:2020-08-24 09:22:55
【问题描述】:

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

我想要类似下面的情节:

【问题讨论】:

    标签: r ggplot2 quantmod


    【解决方案1】:

    虽然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")
    

    【讨论】:

    • 你好约书亚。感谢您发布此答案。我在blog post 中记录了我的观察结果,因为它们太长了,无法发表评论。
    • 感谢 Len,感谢您分享您的观点!
    【解决方案2】:

    原始代码中的错误消息是由于传递给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 个不同的字符值,我们需要重新调整轴以打印更少的标签。

    首先,我们将基于字符的日期转换为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

    【讨论】:

    • @Maryam - 不客气。 ggplot2 很强大,但也很复杂。希望解释足够清楚,以便您可以在需要时修改代码。
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多