【问题标题】:Graphing time-series data when date column doesn't exist当日期列不存在时绘制时间序列数据
【发布时间】:2019-05-27 16:13:27
【问题描述】:

我有以下数据:

set.seed(12)
df <- rnorm(1260, 0.06, 0.2)

这些是 5 年的每日回报(1 年 = 252 个工作日),我想做的是在 x 轴上绘制一个带有月份的折线图。基本上,我会让序列 Jan:Dec 在 x 轴上重复五次,21 天是一个月。

我所做的如下:

  1. 创建一列,月份 jan-dec 重复 5 次
date <- c("Jan", "Feb", "Mär", "Apr", "Mai", "Jun", 
          "Jul", "Aug", "Sep", "Okt", "Nov", "Dez")
date <- rep(date, 5)
  1. 画图
df %>%
       ggplot(aes(x = date, y = return)) +
       geom_line() +
       labs(title = "Stock return Chart", y = "return", x = "date")

不幸的是,我收到以下错误:

 Error: Aesthetics must be either length 1 or the same as the data (1260): x 

【问题讨论】:

  • 你能提供一个最小可行的例子吗?即,提供我们可以复制和粘贴的内容以重现您的错误。
  • df 不是数据框。建议更好的名称或使其成为数据框。此外,如果没有 set.seed 语句来设置随机种子,它也是不可重现的。目前尚不清楚您是想要每天一点还是每月一点或每月烛台或条形图。
  • 这仅解决了我评论中的一点。
  • 我已经提供了答案。但是,我同意@G.Grothendieck 关于您的问题说了些什么并向我们提供了另一件事,例如df 不是数据框。抛开这一点并假设您的数据实际上看起来像这样,我应该说数据清理是在绘制数据之前进行的。
  • @G.Grothendieck 下次我会尽量说得更清楚。我对 R 很陌生,我必须弄清楚什么是数据框,什么不是。

标签: r ggplot2 time-series


【解决方案1】:
library(tidyverse)

df %>%
    as.data.frame() %>%
    rename(price = 1) %>% 
    mutate(rnames = rownames(.)) %>% 
    ggplot(aes(x = as.numeric(rnames), y = price, 
                group = rep(1:5, times=1, each=252))) +
      geom_line() +
      labs(title = "Stock Price Chart", y = "Price", x = "date") +
      scale_x_continuous(breaks = seq(1, 1260, by = 21), labels = date)

reprex package (v0.3.0) 于 2019 年 5 月 27 日创建

【讨论】:

  • 我刚刚在第一个上方的 df 中添加了一个新行,以便价格在时间 = 0 时从 0 开始。我尝试调整代码但无法做到。有没有快速的方法?
  • @JjBlevins 提出后续问题,并提供指向此问题的链接。您仍然需要在另一个线程中制作一个可重现的示例,但参考这个会有所帮助。在那里,提供您的新 df 并在您发布时告诉我。如果可以的话,我会看看并回复。没有可重复的示例,很难说出您需要什么。 (P.S. 你不应该在一个线程中问多个问题,这就是为什么我建议发布另一个问题。)
  • 注意!在此处发布后续消息:stackoverflow.com/questions/56331202/…
【解决方案2】:

试试这个:

price <- rnorm(1260, 0.06, 0.2)

date.base <- c("Jan", "Feb", "Mär", "Apr", "Mai", "Jun", 
          "Jul", "Aug", "Sep", "Okt", "Nov", "Dez")
date <- rep(date.base, 5)

data.frame(date=factor(date, ordered=TRUE, levels=date.base), price=price) %>%
  ggplot(aes(x = date, y = price)) +
  geom_line() +
  labs(title = "Stock Price Chart", y = "Price", x = "date")

【讨论】:

  • 添加了示例数据。这对我不起作用,因为如果我按照您的示例进行操作,则将天标记为月份。
  • 抱歉,我的问题可能表述得不太清楚。 x 轴应如下所示:Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez", Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez",Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez",Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez",Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"
猜你喜欢
  • 2016-11-11
  • 2021-05-18
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多