ggplot2: условное изменение типа линии и цвета

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть следующий фрейм данных:

 df <- tribble(
  ~group,             ~year,   ~value,  
  "group1",     "2010-2015",       70,
  "group2",     "2010-2015",       75,
  "group1",     "2015-2020",       72,
  "group2",     "2015-2020",       77,
  "group1",     "2020-2025",       74,
  "group2",     "2020-2025",       79,
  "group1",     "2025-2030",       76,
  "group2",     "2025-2030",       81)
 

Я хочу отобразить как x, год и как y, значение, окрашенное по группе, т.е.,

 ggplot(df, aes(year, value, color = group, group = group))  
  geom_line(size = 1.1)
 

Но я хочу, чтобы годы «2020-2025» и «2025-2030» были пунктирными линиями.

Используя следующий код, я получаю эту ошибку: «Ошибка: geom_path: если вы используете пунктирные или пунктирные линии, цвет, размер и тип линий должны быть постоянными по всей линии»

 df %>% 
  mutate(projection = year %in% c("2020-2025", "2025-2030")) %>% 
  ggplot(aes(year, value, color = group, group = group))  
  geom_line(aes(linetype = projection), size = 1.1)
 

Ответ №1:

Возможно, попробуйте это

 library(tidyr)
library(dplyr)
library(ggplot2)

df %>% 
  mutate(projection = list("2010-2015" = F, "2015-2020" = c(T, F), "2020-2025" = T, "2025-2030" = T)[year]) %>% 
  unnest(projection) %>% 
  ggplot(aes(year, value, color = group, group = interaction(group, projection)))  
  geom_line(aes(linetype = projection), size = 1.1)
 

Вывод

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


Другая форма

 df %>% 
  mutate(projection = list("2010-2015" = F, "2015-2020" = F, "2020-2025" = c(T, F), "2025-2030" = T)[year]) %>% 
  unnest(projection) %>% 
  ggplot(aes(year, value, color = group, group = interaction(group, projection)))  
  geom_line(aes(linetype = projection), size = 1.1)
 

Вывод

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

Ответ №2:

Это может быть достигнуто с помощью двух geom_line слоев и фильтрации данных, отображаемых каждым:

 library(tidyverse)

df <- tribble(
  ~group,             ~year,   ~value,  
  "group1",     "2010-2015",       70,
  "group2",     "2010-2015",       75,
  "group1",     "2015-2020",       72,
  "group2",     "2015-2020",       77,
  "group1",     "2020-2025",       74,
  "group2",     "2020-2025",       79,
  "group1",     "2025-2030",       76,
  "group2",     "2025-2030",       81)

df1 <- df %>% 
  mutate(projection = year %in% c("2020-2025", "2025-2030"))

ggplot(mapping = aes(year, value, color = group, group = group))  
  geom_line(data = filter(df1, !year %in% c("2025-2030")), size = 1.1)  
  geom_line(data = filter(df1, projection), size = 1.1, linetype = "dashed")