在ggplot中绘制每月时间序列时出错

Posted

技术标签:

【中文标题】在ggplot中绘制每月时间序列时出错【英文标题】:Error while plotting monthly time series in ggplot 【发布时间】:2020-10-08 13:10:00 【问题描述】:

我正在尝试在 ggplot 中创建每月时间序列以进行时间序列分析。这是我的数据:

rdata1

我现在使用下面的代码来更改日期的类别,然后使用 date_labels 和 date_breaks 更轻松地绘制中断和标签。

rdata1 %>%
  变异(日期 = ymd(日期))%>%
  ggplot(aes(日期,sales_revenue_incl_credit))+
  geom_line() +
  scale_x_date(date_labels = "%b %Y", date_breaks = "1 个月")+
  主题_bw()+
  主题(axis.text.x = element_text(角度 = 90,vjust=0.5),
        panel.grid.minor = element_blank())

我收到以下错误:

seq.int(r1$mon, 12 * (to0$year - r1$year) + to0$mon, by) 中的错误: 'from' 必须是有限数

【问题讨论】:

ymd() 函数似乎没有正确获取您的日期。试试mutate(date = ymd(paste0(date, "-01"))) +1 @teunbrand。测试ymd(rdata$date[1]),你会看到你得到NA作为结果。即使您通过as.Date(rdata$date[1], format="%Y-%m")` 指定它也无法工作,因为Date 格式也需要指定日期。建议将“-01”添加到您列中每一天的末尾,然后ymd() 将起作用,如果您指定format="%Y-%m-%d")as.Date() 函数也将起作用。 只是最后一个问题不想为它启动另一个线程我如何为我的每月时间序列数据提供行名?例如,如果我有年度数据 rownames(data) 【参考方案1】:

@Tom 的答案的更简单版本是使用 tsibble 对象和 feasts 包:

# Loading the required libraries

library(tibble)
library(dplyr)
library(ggplot2)
library(lubridate)
library(tsibble)
library(feasts)

# Data preparation

df <- tribble( 
    ~date, ~sales_revenue_incl_credit,
    "2017-07", 56037.46,
    "2017-08", 38333.9,
    "2017-09", 48716.92,
    "2017-10", 65447.67,
    "2017-11", 134752.57,
    "2017-12", 116477.39,
    "2018-01", 78167.25,
    "2018-02", 75991.44,
    "2018-03", 42520.93,
    "2018-04", 70489.92,
    "2018-05", 121063.35,
    "2018-06", 76308.47,
    "2018-07", 118085.7,
    "2018-08", 96153.38,
    "2018-09", 82827.1,
    "2018-10", 109288.83,
    "2018-11", 145774.52,
    "2018-12", 141572.77,
    "2019-01", 123055.83,
    "2019-02", 104232.24,
    "2019-03", 435086.33,
    "2019-04", 74304.96,
    "2019-05", 117237.82,
    "2019-06", 82013.47,
    "2019-07", 99382.67,
    "2019-08", 138455.2,
    "2019-09", 97301.99,
    "2019-10", 137206.09,
    "2019-11", 109862.44,
    "2019-12", 118150.96,
    "2020-01", 140717.9,
    "2020-02", 127622.3,
    "2020-03", 134126.09
  ) %>%
  mutate(date = yearmonth(date)) %>%
  as_tsibble(index=date)

# Reproducing your plot

df %>% autoplot(sales_revenue_incl_credit) +
  scale_x_yearmonth(breaks=seq(1e3)) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5), 
        panel.grid.minor = element_blank())

由reprex package (v0.3.0) 于 2020 年 6 月 19 日创建

【讨论】:

【参考方案2】:

将所有这些问题放在一起,我进行了一些数据准备以获得您想要的输出。首先,如 cmets 中所述,我将每月的第一天附加到每个“年月”,以便您可以在 R 中使用适当的日期变量。接下来,我在 month_year 列上使用了 column_to_rownames() 函数.我将年份附加到月份名称,因为不允许重复(非唯一)行名称。我应该提醒你不要使用行标签。引用文档(见?tibble::rownames_to_column):

虽然 tibble 可以有行名(例如,从常规数据框转换时),但在使用 [ 运算符进行子集化时,它们会被删除。尝试将非 NULL 行名称分配给 tibble 时将引发警告。一般来说,最好避免行名,因为它们基本上是一个字符列,其语义与其他列不同。

您可以使用不同的命名约定来操作下面的行名称。只要确保标签是独一无二的!请参阅下面的 R 代码:

# Loading the required libraries

library(tibble)
library(ggplot2)
library(dplyr)
library(lubridate)

df <- tribble( 
  ~date, ~sales_revenue_incl_credit,
  "2017-07", 56037.46,
  "2017-08", 38333.9,
  "2017-09", 48716.92,
  "2017-10", 65447.67,
  "2017-11", 134752.57,
  "2017-12", 116477.39,
  "2018-01", 78167.25,
  "2018-02", 75991.44,
  "2018-03", 42520.93,
  "2018-04", 70489.92,
  "2018-05", 121063.35,
  "2018-06", 76308.47,
  "2018-07", 118085.7,
  "2018-08", 96153.38,
  "2018-09", 82827.1,
  "2018-10", 109288.83,
  "2018-11", 145774.52,
  "2018-12", 141572.77,
  "2019-01", 123055.83,
  "2019-02", 104232.24,
  "2019-03", 435086.33,
  "2019-04", 74304.96,
  "2019-05", 117237.82,
  "2019-06", 82013.47,
  "2019-07", 99382.67,
  "2019-08", 138455.2,
  "2019-09", 97301.99,
  "2019-10", 137206.09,
  "2019-11", 109862.44,
  "2019-12", 118150.96,
  "2020-01", 140717.9,
  "2020-02", 127622.3,
  "2020-03", 134126.09
  )

# Data preparation

df %>%
  mutate(date = ymd(paste0(date, "-01")),
         month_year = paste(month(date, label = TRUE), year(date), sep = "-")
         ) %>%
  column_to_rownames("month_year") %>%  # sets the column labels to row names
  head()

# Preview of the data frame with row names (e.g., Jul-2017, Aug-2017, Sep-2017, etc.)

               date sales_revenue_incl_credit
Jul-2017 2017-07-01                  56037.46
Aug-2017 2017-08-01                  38333.90
Sep-2017 2017-09-01                  48716.92
Oct-2017 2017-10-01                  65447.67
Nov-2017 2017-11-01                 134752.57
Dec-2017 2017-12-01                 116477.39

# Reproducing your plot

df %>%
  ggplot(aes(x = date, y = sales_revenue_incl_credit)) +
  geom_line() +
  scale_x_date(date_labels = "%b %Y", date_breaks = "1 month") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5), 
        panel.grid.minor = element_blank())

【讨论】:

以上是关于在ggplot中绘制每月时间序列时出错的主要内容,如果未能解决你的问题,请参考以下文章

通过 geom_tile ggplot R 的热图 - 正确组织每月因子的 y 轴水平

在ggplot2中绘制两个具有相同y变量但不同x变量的箱线图

在 R 中预测时自动绘图功能出错

使用 ggplot 绘制绘图时,hjust 和 vjust 做了啥?

绘制时间序列热图时提高 ggplotly 的性能

将 ggplot 气泡图导入 Shiny 时出错