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
。
- 情节缺失
variable
- 第 1 层缺失
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()
和 Date
和 Close
作为 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")
我有一个包含多只股票的时间序列数据。我想将它们绘制在 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
我想要类似下面的情节:
原始代码中的错误消息是由于传递给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 个不同的字符值,我们需要重新缩放轴以打印更少的标签。
首先,我们将 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
。
虽然
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")