ggplot2 цвет geom_point по коэффициенту, но geom_smooth на основе всех данных

В ggplot2 следующая команда p <- qplot(wt, mpg, data=mtcars, colour=factor(cyl)) взятая здесь, отображает график рассеяния с каждой точкой, окрашенной в соответствии с коэффициентом

Я хотел бы поместить все данные с помощью geom_smooth независимо от коэффициента, но сохраняя цвет отдельных точек в соответствии с коэффициентом. p + geom_smooth(method="lm") выполняет линейную подгонку по каждому фактору. Как мне это сделать?

Ответ 1

Вы можете сделать это довольно легко, отступив от функции обертки "qplot" и напрямую используя функции "ggplot" и "geometry".

ggplot(mtcars, aes(x=wt, y=mpg)) +
    geom_point(aes(colour=factor(cyl))) +
    geom_smooth(method="lm")

demo chart

Шаг 1. Установите начальные настройки "ggplot". Это настройки, которые вы хотите использовать по умолчанию для функций геометрии.

ggplot(mtcars, aes(x=wt, y=mpg))

В этом случае мы используем данные "mtcars" для всех геометрий с "wt", назначенными на ось x и "mpg", назначенные на ось y. Указав их в начале, мы уменьшаем риск того, что что-то испортим, когда скопируем в геометрические функции.

Шаг 2. Нарисуйте геометрию точки, используя коэффициенты "цил" для окраски точек. Это то, что делала оригинальная функция "qplot", но мы уточняем ее немного более четко.

    geom_point(aes(colour=factor(cyl)))

Шаг 3: Нарисуйте сглаженную линейную модель. Это именно то, что написал OP раньше, но теперь, когда эстетика окраски больше не является частью значений по умолчанию, модель рисует по назначению.

    geom_smooth(method="lm")

Цепляйте все это вместе с + et voila!

Для справки: вы могли бы так же легко сделать это, будучи явным в каждом слое, например:

ggplot() +
    geom_point(data=mtcars, aes(x=wt, y=mpg, colour=factor(cyl))) +
    geom_smooth(data=mtcars, method="lm", aes(x=wt, y=mpg))

Ответ 2

На мой взгляд, вы найдете ggplot намного проще, если вы начнете использовать ggplot() а не qplot. Контроль эстетики дает больше смысла. В этом случае вы просто строите свою базу:

p <- ggplot(mtcars, aes(wt, mpg))

Затем постройте два geom сверху:

p + geom_point(aes(colour = factor(cyl))) +
  geom_smooth(method = "lm")

enter image description here

Дай мне знать, если это не то, что тебе нужно.

Ответ 3

Я согласен с предыдущими ответами от @alexwhan и @Dinre, что ggplot() + geom_point (...) +... - лучший подход к этой проблеме

Однако, если вы просто хотите изменить свое решение, попробуйте

p + geom_smooth(method = 'lm', aes(colour = NA), colour = 'magenta')