Построение временного ряда в ggplot со строками, сгруппированными по годам

Я пытаюсь построить временной ряд с годами на разных линиях. Возьмите этот пример:

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

df = data.frame(dt = seq(as.Date("2015/01/01"), by = "day", length.out = 1000),
     num = c(sample(1:333), sample(333:665), sample(665:998)))

Затем с этими примерами данных я пытаюсь построить:

ggplot(df, aes(x= format(dt, format="%m-%d"), y=num, group = as.factor(year(dt)))) 
    + geom_line()

Это возвращает предупреждение о том, что geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?. Замена color на group дает мне что-то похожее на то, что я хочу, но ось X имеет слишком много меток, поскольку ее тип — строка.

TimeSeriesPlot

Как бы вы сделали так, чтобы ось x отображала здесь только 1-й день каждого месяца? Или есть лучший способ построить такой временной ряд?


person Matsutake    schedule 16.01.2018    source источник
comment
Если я удалю x=format(dt,format="%m-%d") и просто использую x=dt, я получу правильное форматирование. Дополнительные параметры — ggplot2.tidyverse.org/reference/scale_date.html   -  person Jason    schedule 16.01.2018


Ответы (1)


Я думаю, было бы проще, если бы вы просто преобразовали все даты в один и тот же год и использовали это для построения оси X. Затем вы можете настроить масштаб, чтобы получить нужные метки. Например

same_year <- function(x) {
  year(x) <- 2000
  x
}

ggplot(df, aes(x=same_year(dt), y=num, color = as.factor(year(dt)))) + 
  geom_line()  + 
  scale_x_date(date_breaks = "1 month", date_labels="%b")

Что возвращает

введите здесь описание изображения

person MrFlick    schedule 16.01.2018