Легенды линии ggplot2 выглядят «перечеркнутыми» - PullRequest
0 голосов
/ 15 января 2019

Я создаю ggplot с двумя строками, каждая из которых состоит из отдельных geoms. Как пример:

df = data.frame(
   x.v = seq(0, 1, 0.025),
   y.v = runif(41)
)
straight.line = data.frame(
   Inter = c(0),
   Slope = c(1)
)

p = ggplot() +
   geom_point(
      mapping = aes(
         x = x.v,
         y = y.v
      ),
      data = df,
      colour = "blue"
   ) +
   geom_smooth(
      mapping = aes(
         x = x.v,
         y = y.v,
         colour = "line of best fit"
      ),
      data = df,
      method = "lm",
      show.legend = NA
   ) +
   geom_abline(
      mapping = aes(
         intercept = Inter,
         slope = Slope,
         colour = "y = x"
      ),
      data = straight.line,
     show.legend = NA
   ) +
   guides(
      fill = "none",
      linetype = "none",
      shape = "none",
      size = "none"
   )

Это дает вывод:

Output of the above code

Как видите, легенда имеет странные диагональные линии. ответ на аналогичный вопрос говорит, что это можно исправить с помощью show.legend = NA. Однако, как вы можете видеть из приведенного выше кода, я сделал это, и это не изменило результат.

Кто-нибудь знает, что добавляет диагональные линии в легенду и как еще я могу это исправить, пожалуйста? Спасибо.

РЕДАКТИРОВАТЬ: Вопрос, если это дубликат это . Это может быть ответ, но как мне применить это, когда в ответе по ссылке используется заливка, а я использую цвет, пожалуйста?

Если я попытаюсь

+ guides(colour = guide_legend(override.aes = list(colour = NULL)))

Я получаю ошибку

Error in check.length("col") : 'gpar' element 'col' must not be length 0

и если я попытаюсь

+ guides(colour = guide_legend(override.aes = listfill = NULL)))

Я получаю ошибку

Error in `$<-.data.frame`(`*tmp*`, "fill", value = character(0)) : 
  replacement has 0 rows, data has 1

1 Ответ

0 голосов
/ 15 января 2019

работают следующие работы:

library(ggplot2)

ggplot() +
  geom_point(mapping = aes(x = x.v, y = y.v),
             data = df, colour = "blue") +
  geom_smooth(mapping = aes(x = x.v, y = y.v, colour = "line of best fit"),
              data = df, method = "lm", show.legend = NA) +
  geom_abline(mapping = aes(intercept = Inter, slope = Slope, colour = "y = x"),
              data = straight.line, show.legend = FALSE) +
  guides(fill = "none", linetype = "none",  shape = "none", size = "none")

Код можно сделать немного менее повторяющимся, и мы можем пропустить некоторые вещи (например, guide -call):

ggplot(data = df, mapping = aes(x = x.v, y = y.v)) +
  geom_point(colour = "blue") +
  geom_smooth(aes(colour = "line of best fit"), method = "lm") +
  geom_abline(mapping = aes(intercept = Inter, slope = Slope, colour = "y = x"),
              data = straight.line, show.legend = FALSE) 

enter image description here

Почему нам нужно использовать show.legend = FALSE здесь, а не show.legend = NA?

Из документации:

show.legend

логичной. Должен ли этот слой быть включен в легенды? NA, по умолчанию, включает в себя отображение любой эстетики. ЛОЖЬ никогда не включает, и ИСТИНА всегда включает. Это также может быть именованный логический вектор для точного выбора эстетики для отображения

Это означает, что мы используем show.legend = NA для вызова geom_abline, который мы используем этот слой в легенде. Однако мы не хотим использовать этот слой и поэтому нуждаемся в show.legend = FALSE. Вы можете видеть, что это не влияет, какие цвета включены в легенду, только слой.

Данные

set.seed(42) # For reproducibilty
df = data.frame(x.v = seq(0, 1, 0.025),
                y.v = runif(41))
straight.line = data.frame(Inter = 0, Slope = 1)
...