Q:

Plotting a Time Series in ggplot, with lines grouped by Year

I am trying to plot a time series with years each on different lines. Take this example:
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)))

With this sample data, I then try to plot:
ggplot(df, aes(x= format(dt, format="%m-%d"), y=num, group = as.factor(year(dt)))) 
    + geom_line()

This returns a warning that geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?. Replacing color with group gives me something similar to what I want, but the x-axis has too many labels since its type is string.

How would you make it so that the x-axis only displays the 1st day of each month here? Or is there a better way to plot a time series like this?

A:

I think it would be easiest if you just converted all the dates to the same year and use that for plotting the x-axis. Then you can customize the scale to get the labels you want. For example
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")

Which returns

