ggplot для полной легенды о точках и линейных формах - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь добавить две простые линейные регрессии с помощью ggplot всего за один график. но проблема в том, что когда я пытаюсь добавить легенду для значений и строк, ошибка заключается в том, что строки различаются в двух наборах данных. Как я могу это исправить, хотя у меня есть желаемая легенда на графике как для значений, так и для линий с желаемыми цветами? пример: у меня есть набор данных, который я случайно разделил на два меньших набора данных. Я хочу, чтобы у меня была ОДИНАРНАЯ СУМКА, где у меня есть простая линейная регрессия всего набора данных (a) и одна для меньшего набора данных (d или e), все на одном графике, с полной легендой для точек (что точка принадлежит какому набору данных, и для линий с разными цветами для каждого). В столбце c указано, какое значение принадлежит какому набору данных.

a <- 
V1   V2   V3
a1   b1   d 
a2   b2   d
a3   b3   e
a4   b4   e
a5   b5   d
a6   b6   e
a7   b7   e
a8   b8   d
a9   b9   d
a10  b10  d

d <-
V1  V2 
a1  b1
a2  b2
a5  b5
a8  b8 
a9  b9
a10 b10  

e <-
V1  V2 
a3  b3
a4  b4
a6  b6
a7  b7

Примечание: количество строк для наборов данных отличается друг от друга. Я использую geom_line, как это. Я не хочу использовать geom_smooth.

 r = lm(formula = V2 ~ V1,
                data = e)
   geom_line(data = e, aes(x = V1, y = predict(r, newdata = e)),
              col = "e", size = 1)

Но когда я использую

scale_color_manual(name="something", values=c("a"="blue","e"="green"))

, программа выдает ошибку, которая:

Error in grDevices::col2rgb(colour, TRUE) : invalid color name

1 Ответ

1 голос
/ 06 марта 2020

Предполагаю, что переменные - это числа ... Использование geom_smooth (я проверил с помощью mtcars):

library(ggplot2)

ggplot(a, aes(V1, V2, color = V3)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  geom_smooth(aes(color = "all"), method = "lm", se = FALSE)

Чтобы вручную настроить легенды, смотрите, например, здесь: Как добавить легенду в строку ggplot2 с точечным графиком?

Вычисление линий регрессии вручную и использование geom_line. Используя mtcars (V1 = mpg, V2 = hp, V3 = cyl) в качестве примера данных:

library(ggplot2)
library(dplyr)
library(purrr)

df <- mtcars %>% 
  mutate(p_all = predict(lm(hp ~ mpg, .))) %>% 
  group_split(cyl) %>% 
  map(~ mutate(.x, p_cyl = predict(lm(hp ~ mpg, .x)))) %>% 
  bind_rows(.id = "dataset")

ggplot(df, aes(mpg, color = factor(cyl))) +
  geom_point(aes(y = hp)) +
  geom_line(aes(y = p_cyl, group = factor(cyl))) +
  geom_line(aes(y = p_all, color = "all"))

Идея состоит в том, чтобы сначала добавить прогнозные значения для всего набора данных (p_all), а затем разделить набор данных, добавить прогнозируемые значения для каждого из наборов данных (p_cyl) и связать их вместе. Идея построения графика на одном графике, по сути, та же, что и при использовании geom_smooth.

. И если вы просто хотите построить линию регрессии только для одного из ваших наборов данных, это работает в основном так же. Просто настройте весы вручную. Надеюсь, что я становлюсь ближе к сюжету, который вы имели в виду (;:

ggplot(df, aes(mpg, color = factor(cyl), linetype = factor(cyl), shape = factor(cyl))) +
  geom_point(aes(y = hp)) +
  geom_line(aes(y = p_all, color = "all", linetype = "all", , shape = "all")) +
  geom_line(aes(y = p_cyl, group = factor(cyl))) +
  scale_linetype_manual(values = c(1, NA, NA, 1)) +
  scale_shape_manual(values = c(16, 16, 16, NA))
...