Ошибка при построении месячных временных рядов в ggplot - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь создать ежемесячный временной ряд в ggplot для анализа временных рядов. Это мои данные:

rdata1 <- read_table2("date  sales_revenue_incl_credit 
                                    2017-07 56,037.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")

Теперь я использую приведенный ниже код, чтобы изменить класс даты, а затем гораздо проще построить график с разрывами и метками, используя date_labels и date_breaks. получите следующую ошибку:

Ошибка в seq.int (r1 $ mon, 12 * (to0 $ year - r1 $ year) + to0 $ mon, by): 'from' должно быть конечным номер

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Объединив все эти соображения, я выполнил некоторую подготовку данных, чтобы получить желаемый результат. Во-первых, как отмечалось в комментариях, я добавил первый день месяца к каждому «год-месяц», чтобы вы могли работать с правильной переменной даты в R. Затем я использовал функцию column_to_rownames() в столбце month_year . Я добавил год к названию месяца, потому что повторяющиеся (неуникальные) имена строк не допускаются. Я должен предостеречь вас от использования меток строк. Цитата из документации (см. ?tibble::rownames_to_column):

Хотя тиббл может иметь имена строк (например, при преобразовании из обычного фрейма данных), они удаляются при подмножестве с помощью оператора [. При попытке присвоить тибблу имена строк, отличные от NULL, будет выдано предупреждение. Как правило, лучше избегать имен строк, потому что они в основном представляют собой символьный столбец с семантикой, отличной от семантики любого другого столбца.

Вы можете управлять именами строк ниже, используя различные соглашения об именах. Только убедитесь, что этикетки уникальны! См. Код 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())
0 голосов
/ 19 июня 2020

Более простой вариант ответа @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())

Создано 2020-06- 19 с помощью пакета REPEX (v0.3.0)

...