Линейный график с «без годовой» датой - PullRequest
0 голосов
/ 28 марта 2020

У меня есть данные о преступности за 2018-2020 годы. Каждый ряд представляет одно преступление. Для примера рассмотрим, что есть две переменные crimetype (например, кража, грабеж) и date (когда было совершено преступление).

Некоторые примеры данных:


data <- data.frame(date= sample(seq(as.Date('2018/01/01'), as.Date('2020/12/31'), by="day"),10000, replace=T),
                   crimetype = sample(c("A", "B", "C"), 100000, replace=T))

Моя цель - создать сюжет для, скажем, преступлений типа "А". На оси абсцисс должна быть дата (с 1 января по 31 декабря), на оси ординат должно быть количество преступлений в день. Однако, поскольку я хочу, чтобы три линии (по одной на каждый год) отображались друг над другом, чтобы я мог их сравнить, на оси х не должно быть года. Или это не должно отображаться по крайней мере.

  ^        . . . . . .
  |     . .           .
  | . .                .
n |                      . 2018
  |      - - -
  | - - -      - - - - - 2019
  | = = =
  |       = = = = = = = = 2020
  |
  ------------------------------------->
   Jan-1                Dec-31                        

Я пытался создать новую переменную даты со всеми датами в том же году (здесь 2020).

data <- data %>% mutate(daymonth = substr(date, 5, length(date)),
                        date_new = as.Date(paste("2020", daymonth, sep="")),
                        daymonth = NULL)

Есть ли лучший способ сделать это и как я могу построить график?

data_plot <- data %>% filter(crimetype == 'A')
ggplot(data = data_plot, aes(x = date_new, y = ?, color=format(date, "%Y")) + geom_line()

1 Ответ

1 голос
/ 28 марта 2020

Для работы с датами взгляните на пакет lubridate, который я использую здесь для извлечения года. Также вы можете избавиться от года с помощью format(date, "%d-%m"). Следующий подход немного взломан. Чтобы использовать ось даты, но все же избавиться от года, я установил год для всех дат на 2018. Вопрос о том, какую переменную нужно построить ... просто посчитайте obs, чтобы получить количество преступлений по дате. В заключение. Я установил разрывы оси даты на 1 месяц. Отрегулируйте это как хотите. Попробуйте это:

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

data <- data.frame(date= sample(seq(as.Date('2018/01/01'), as.Date('2020/12/31'), by="day"),10000, replace=T),
                   crimetype = sample(c("A", "B", "C"), 100000, replace=T))

data_plot <- data %>%
  mutate(
    year = lubridate::year(date),
    year = factor(year),
    # A hack. Set year to 2018. Allows me to use a date axis
    date_foo = as.Date(paste(2018, format(date, "%m-%d"), sep = "-"))) %>% 
  filter(crimetype == 'A') %>% 
  count(date, date_foo, year, crimetype)

ggplot(data = data_plot, aes(x = date_foo, y = n, color = year, group = year)) + 
  geom_line() +
  scale_x_date(date_breaks = "1 month", date_labels = "%d-%m")
#> Warning: Removed 1 row(s) containing missing values (geom_path).

Создано в 2020-03-28 пакетом prex (v0.3.0)

...