0

I have a time series I would like to plot in ggplot. I want to show that there's a break in the data at a certain point. I believe a good way to do this is by varying the line type (ie lty). However, doing so makes an annoying break in the plot. Is there a way to connect these lines?

Here is some sample code of a time series at which there's a "break" where year == 0:

df = tibble(year = -5:5, value=runif(11))
df$lty = df$year <= 0

ggplot(data=df, aes(x=year, y=value, lty=lty)) + geom_line()

I'm having difficulty uploading the resultant image, but it makes a line graph with a jump between year == 0 and year == 1, which I don't want.

Thanks, smart people of the internet!!!

Konrad Rudolph
  • 530,221
  • 131
  • 937
  • 1,214
user1713174
  • 307
  • 2
  • 7

1 Answers1

1

This quirk is caused by ggplot's implicit grouping of datapoints based on colour, linetype etc. Setting the group manually to something isn't going to solve this, because there is a 1-line-1-look rule.

Here are two options.

Option 1: simply copy the datapoint and modify in place:

library(tidyverse)

df = tibble(year = -5:5, value=runif(11))
df$lty = df$year <= 0

df <- rbind(df, df[df$year == 0,])
df$lty[nrow(df)] <- FALSE

ggplot(data=df, aes(x=year, y=value, lty=lty)) + geom_line()

Option 2: Parameterise your data as segments instead

df = tibble(year = -5:5, value=runif(11))
df = cbind(head(df, -1),
           tail(df, -1)) %>%
  setNames(c("year0", "value0", "year1", "value1"))

df$lty <- df$year0 <= 0 & df$year1 <= 0

ggplot(df, aes(x = year0, y = value0, xend = year1, yend = value1, linetype = lty)) +
  geom_segment()

Created on 2020-05-27 by the reprex package (v0.3.0)

teunbrand
  • 33,645
  • 4
  • 37
  • 63