Выберите цвета линии линейной регрессии

Как установить цвета линий линейной регрессии независимо от цветов линий?


library(tidyverse)

df <- tibble(
  x = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6),
  y = c(1, 3, 2, 4, 1, 4, 2, 5, 3, 7, 5, 10),
  type = c("A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B")
)

ggplot(df, aes(x = x, y = y)) +
  geom_line(aes(colour = type), size = 4) +
  scale_x_continuous(breaks = 1:6) +
  geom_smooth(data = filter(df, x >= 3), aes(x = x, y = y, group = type), method = "lm", se = FALSE, size = 0.5) +
  scale_color_manual(values = c("A" = "dark red", "B" = "dark blue")) +
  theme_minimal()

Всего 2 ответа


Один из способов (что-то вроде хака) - указать цвет в функции geom_smooth. Поскольку вы устанавливаете прямую линию, для кривой необходимы только 2 точки. Используйте параметры n и color , а затем создайте вектор нужных цветов.

ggplot(df, aes(x = x, y = y)) +
  geom_line(aes(colour = type), size = 4) +
  scale_x_continuous(breaks = 1:6) +
  geom_smooth(data = filter(df, x >= 3), aes(x = x, y = y, group=type), method = "lm",
              se = FALSE, size = 2, n=2, col=rep(c("pink", "green"), each=2)) +
  scale_color_manual(values = c("A" = "dark red", "B" = "dark blue")) +
  theme_minimal()

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


Самый простой способ, если вы просто ищете один цвет для обеих линий регрессии, это добавить colour аргумент к вашему вызову geom_smooth .

 library(tidyverse) df <- tibble( x = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6), y = c(1, 3, 2, 4, 1, 4, 2, 5, 3, 7, 5, 10), type = c("A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B") ) ggplot(df, aes(x = x, y = y)) + geom_line(aes(colour = type), size = 4) + scale_x_continuous(breaks = 1:6) + scale_color_manual(values = c("A" = "dark red", "B" = "dark blue")) + geom_smooth(data = filter(df, x >= 3), aes(x = x, y = y, group = type), colour = 'black', method = "lm", se = FALSE, size = 0.5) theme_minimal() 

Если вы хотите иметь отдельные цвета для линий регрессии, вы можете отразить переменную type и цвет на основе новой переменной, как показано ниже:

 library(tidyverse) df <- tibble( x = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6), y = c(1, 3, 2, 4, 1, 4, 2, 5, 3, 7, 5, 10), type = c("A", "B", "A", "B", "A", "B", "A", "B", "A", "B", "A", "B") ) ggplot(df, aes(x = x, y = y)) + geom_line(aes(colour = type), size = 4) + # mirror the `type` variable geom_smooth(data = filter(df, x >= 3) %>% mutate(class = factor(ifelse(type == 'A', 0, 1))), # group and colour on `class` instead of `type` aes(x = x, y = y, colour = class), method = "lm", se = FALSE, size = 2) + scale_colour_manual(name = 'Type', values = c('A' = '#6703AA', 'B' = '#BB8901', '0' = '#FF2499', '1' = '#00BBFF'), # add breaks to hide '0' and '1' in legend breaks = c('A', 'B')) + scale_x_continuous(breaks = 1:6) + theme_minimal() 

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

Может быть, мы упускаем из виду более простой способ, но это четкий и эффективный метод для того, что вам нужно.

Примечание: не забудьте изменить цвета, которые я предоставил при вызове scale_colour_manual; они действительно ужасны.


Есть идеи?

10000