Подтвердить что ты не робот

R - комбинированные geom_vline и geom_smooth в легенде

Я встречаюсь с каким-то странным поведением в моей легенде при добавлении geom_smooth() и geom_vline() в моей диаграмме ggplot2. Здесь воспроизводимый пример:

library(ggplot2)
n <- 60

set.seed(123)
df <- data.frame(Area = sample(c("A", "B", "C", "D"), size = n, replace = TRUE),
             x = runif(n),
             y = runif(n),
             Type = sample(c("I", "II"), size = n, replace = TRUE),
             Result = sample(c("K", "L", "M"), size = n, replace = TRUE))

df.breaks <- data.frame(Area = c("B", "C"), x = c(0.8, 0.3))

ggplot(df, aes(x = x, y = y)) + 
  geom_point(aes(colour = Result, shape = Type), size = 3) + 
  geom_smooth(aes(linetype = "Smooth"), colour = "green", se = FALSE) + 
  geom_hline(yintercept = 0.3) + 
  facet_wrap(~Area) + 
  geom_vline(data = df.breaks, aes(xintercept = x, linetype = "Break"), colour = "purple") + 
  scale_colour_manual(values = c("K" = "red", "L" = "orange", "M" = "blue")) + 
  scale_linetype_manual(name = "Lines", values = c("Break" = "dashed", "Smooth" = "solid"))

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

Как вы заметите, легенда "Lines" имеет как вертикальные, так и горизонтальные строки в каждом элементе, а в первом случае есть пара пунктирных линий, а во втором случае - несколько сплошных линий. Я пытаюсь настроить свой код для создания легенды с (1) горизонтальной зеленой линией и рядом с ней рядом с названием "Гладкая" и (2) вертикальной фиолетовой линией с клавишей рядом с ней, называемой "Break". Я был бы признателен за помощь, как бы я ни старался (включая linetype внутри/снаружи aes() и т.д., Или используя scale_linetype_identity(), или даже параметр override.aes в guides), я не смог найти нужное сочетание!

Я искал аналогичные примеры, и хотя я нашел другие сообщения с наложенной вертикальной линией на colour, fill или shape и т.д., я не нашел один с вертикальной строкой на linetype легенда, такая как моя. Любая помощь будет глубоко оценена! Спасибо!

4b9b3361

Ответ 1

Запоздалый ответ на этот вопрос, но я подумал, что было бы лучше иметь ответ на случай, если кто-то другой (или мое будущее я!) заинтересован в этом.

Следуя предложению @aosmith в разделе комментариев и его поддержке предоставить ответ, я в конечном итоге заменил код для сюжета:

ggplot(df, aes(x = x, y = y)) + 
     geom_point(aes(colour = Result, shape = Type), size = 3) + 
     geom_hline(yintercept = 0.3) + 
     facet_wrap(~Area) + 
     geom_vline(data = df.breaks, 
                aes(xintercept = x, linetype = "Break"), colour = "purple") + 
     scale_colour_manual(values = c("K" = "red", "L" = "orange", "M" = "blue")) + 
     scale_linetype_manual(name = "Lines",
                           values = c("Break" = "dashed", "Smooth" = "solid")) + 
     geom_smooth(aes(fill = "Smooth"), method = "loess", colour = "green", se = FALSE) + 
     scale_fill_discrete(name = "")

Последние две строки выше заменяют следующую строку из исходного кода:

geom_smooth(aes(linetype = "Smooth"), colour = "green", se = FALSE) +.

В результате диаграмма по-прежнему нуждается в некоторой работе, особенно с интервалом между легендами, но она решает исходную проблему.

Вертикальная и горизонтальная легенда линии