首页 > 解决方案 > 转换为具有单列的 data.frame 后在 ggplot 中绘图?

问题描述

我正在尝试将一些简单的数据转换为我认为 ggplot2 可以接受的形式。

我抓住了一些简单的股票数据,现在我只想绘制,稍后我想绘制一个 10 天移动平均线或一个 30 天历史波动期来与之配套,这就是我正在使用的 ggplot。

我认为它会像这行伪代码一样工作

ggplot(maindata)+geom_line(移动平均线)+geom_line(30dayvol)

library(quantmod)
library(ggplot2)
start = as.Date("2008-01-01")
end = as.Date("2019-02-13")
start
tickers = c("AMD")
getSymbols(tickers, src = 'yahoo', from = start, to = end)

closing_prices = as.data.frame(AMD$AMD.Close)

ggplot(closing_prices, aes(y='AMD.Close'))

但我什至无法让它工作。当然,问题似乎是我没有 x 轴。如何告诉 ggplot 使用索引列作为 a. 这行不通吗?我必须创建一个新的“日期”或“日期”列吗?

这条线例如使用Regular R plot函数就可以了

plot.ts(closing_prices) 

这不需要我输入硬 x 轴并生成一个图形,但是我还没有弄清楚如何将其他线分层到同一个图形上,显然 ggplot 更好,所以我尝试了。

有什么建议吗?

标签: rggplot2

解决方案


as.Date(rownames(df))将为您获取行名并将其解析为日期。您还需要指定一个geom_line()

library(quantmod)
library(ggplot2)
start = as.Date("2008-01-01")
end = as.Date("2019-02-13")
start
tickers = c("AMD")
getSymbols(tickers, src = 'yahoo', from = start, to = end)

closing_prices = as.data.frame(AMD$AMD.Close)

ggplot(closing_prices, aes(x = as.Date(rownames(closing_prices)),y=AMD.Close))+
  geom_line()

编辑

认为与评论相反,在答案中解释会更容易。

ggplot 和 dplyr 有两种评估方法。标准和非标准评价。这就是为什么在 ggplot 中你同时拥有aesaes_()。前者为非标准评价,后者为标准评价。此外还有aes_string()哪些也是标准的评价。

这些有什么不同?

当我们探索所有方法时很容易看到,

#Cleaner to read, define every operation in one step
#Non Standard Evaluation
closing_prices%>%
  mutate(dates = as.Date(rownames(.)))%>%
  ggplot()+
  geom_line(aes(x = dates,y = AMD.Close))

#Standard Evaluation

closing_prices%>%
  mutate(dates = as.Date(rownames(.)))%>%
  ggplot()+
  geom_line(aes_(x = quote(dates),y = quote(AMD.Close)))

closing_prices%>%
  mutate(dates = as.Date(rownames(.)))%>%
  ggplot()+
  geom_line(aes_string(x = "dates",y = "AMD.Close"))

为什么有这么多不同的方法来做同样的事情?在大多数情况下,可以使用非标准评估。但是,如果我们想将这些绘图包装在函数中,并根据作为字符串传递的函数参数动态更改要绘图的列。aes_使用和进行绘图很有帮助aes_string


推荐阅读