How to change line properties in ggplot2 halfway in a time series?
Asked Answered
I

2

5

Take the following straightforward plot of two time series from the economics{ggplot2} dataset

require(dplyr)
require(ggplot2)
require(lubridate)
require(tidyr)

economics %>%
  gather(indicator, percentage, c(4:5), -c(1:3, 6)) %>%
  mutate(Y2K = year(date) >= 2000) %>%
  group_by(indicator, Y2K) %>%
  ggplot(aes(date, percentage, group = indicator, colour = indicator)) + geom_line(size=1)

enter image description here

I would like to change the linetype from "solid" to "dashed" (and possibly also the line size) for all points in the 21st century, i.e. for those observations for which Y2K equals TRUE.

I did a group_by(indicator, Y2K) but inside the ggplot command it appears I cannot use group = on multiple levels, so the line properties only differ by indicator now.

Question: How can I achieve this segmented line appearance?

UPDATE: my preferred solution is a slight tweak from the one by @sahoang:

economics %>%
        gather(indicator, percentage, c(4:5), -c(1:3, 6)) %>%
        ggplot(aes(date, percentage, colour = indicator)) + 
        geom_line(size=1, aes(linetype = year(date) >= 2000)) +
        scale_linetype(guide = F)

This eliminates the group_by as commented by @Roland, and the filter steps make sure that the time series will be connected at the Y2K point (in case the data would be year based, there could be a visual discontinuity otherwise).

Integument answered 15/4, 2015 at 12:49 Comment(1)
You don't need to map to group at all. You simply need an additional grouping variable that linetype is mapped to. Possibly you need to duplicate points where the switch occurs. Can't help you more since dplyr isn't to my taste.Fink
L
5

Even easier than @Roland's suggestion:

economics %>%
    gather(indicator, percentage, c(4:5), -c(1:3, 6)) %>%
    mutate(Y2K = year(date) >= 2000) %>%
    group_by(indicator, Y2K) -> econ

ggplot(econ, aes(date, percentage, group = indicator, colour = indicator)) + 
  geom_line(data = filter(econ, !Y2K), size=1, linetype = "solid") + 
  geom_line(data = filter(econ, Y2K), size=1, linetype = "dashed")

enter image description here

P.S. Alter plot width to remove spike artifacts (red line).

Lest answered 15/4, 2015 at 13:25 Comment(0)
D
4
require(dplyr)
require(ggplot2)
require(lubridate)
require(tidyr)


economics %>%
  gather(indicator, percentage, c(4:5), -c(1:3, 6)) %>%
  mutate(Y2K = year(date) >= 2000) %>%
  ggplot(aes(date, percentage, colour = indicator)) + 
  geom_line(size=1, aes(linetype = Y2K))
Donee answered 15/4, 2015 at 13:32 Comment(2)
thanks, but I accept the answer from @Lest because it does not create a separate legend for the linetype.Integument
If you want to get rid of the linetype legend you can add scale_linetype(guide = F).Donee

© 2022 - 2024 — McMap. All rights reserved.