ggplot устанавливает приоритет перекрытия линий

library(tidyverse)
mtcars %>% 
  mutate(ID = row_number()) %>% 
  select(ID, vs, am, gear, carb) %>% 
  gather(key, value, 2:5) %>% 
  mutate(violation = c(rep(FALSE, 96), rep(TRUE, 32))) %>% 
  ggplot(aes(ID, value, group = key, color = violation)) + 
  scale_color_manual(values = c("grey", "red")) + 
  geom_line() + 
  theme_classic()

На изображении ниже красная линия «нарушения» разбита на сегменты. Я предполагаю, что это потому, что ggplot строит линии последовательно, а одна из серых линий строится после красной линии с теми же координатами. Как я могу остановить серые линии от наложения красных?

Как указано в других вопросах, связанных со стековым потоком, я бы добавил отдельную строку, например:

geom_line(df %>% filter(violation == TRUE), aes(color = "red")) +

но это вызывает проблемы, когда в моих фреймах данных нет нарушений. Я делаю ежемесячные анализы, и некоторые месяцы содержат нарушения, а некоторые нет. Если я добавлю эту единственную строку выше, я получу сообщение об ошибке «должна быть длина больше 0» в течение нескольких месяцев отсутствия нарушений, поэтому такой однострочный подход, вероятно, не будет работать.

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

Всего 1 ответ


Вы можете использовать следующий код (только с 2 незначительными изменениями по сравнению с вашим кодом)

library(tidyverse)
mtcars %>% 
  mutate(ID = row_number()) %>% 
  select(ID, vs, am, gear, carb) %>% 
  gather(key, value, 2:5) %>% 
  mutate(violation = c(rep(FALSE, 96), rep(TRUE, 32))) %>% 
  ggplot(aes(ID, value, group = key, color = violation)) + 
  scale_color_manual(values = c("grey", "red")) + 
  geom_line(alpha = .5, size= 1.2) + ### changes in transparancy and thickness ###
  theme_classic()

Получив этот участок: введите описание изображения здесь

Предложение «H 1» является альтернативным подходом, который изменяет последовательность чертежей:

mtcars %>% 
  mutate(ID = row_number()) %>% 
  select(ID, vs, am, gear, carb) %>% 
  gather(key, value, 2:5) %>% 
  mutate(violation = c(rep(FALSE, 96), rep(TRUE, 32))) %>% 
  ggplot(aes(ID, value, group = key, color = violation)) + 
  scale_color_manual(values = c("grey", "red")) + 
  geom_line(aes(group = rev(key))) + ### changes sequence of plotting of the lines ###
  theme_classic()

Это дает следующий сюжет:

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


Есть идеи?

10000