Предполагая, что у меня есть фрейм данных со следующими заголовками столбцов: рост, вес, пол.
Я использую ggplot для создания точечной диаграммы.
ggplot(df, aes(x = height, y = weight , col = gender)) +
geom_point() +
theme_classic() +
geom_smooth(method = "lm", se = FALSE)
Это строит две линии регрессии, одну для мужчин и женщин. Я хотел бы добавить еще одну регрессию для общего сравнения роста и веса. Как мне это сделать?
Вы можете добавить еще один geom_smooth
с col
, установленным на статическую метку. Это переопределяет первый аргумент aes(col = gender)
, возвращает все наблюдения в одну группу и дает им метку, которую вы хотите использовать:
library(ggplot2)
ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, col = Species)) +
geom_point() +
theme_classic() +
geom_smooth(method = "lm", se = FALSE) +
geom_smooth(aes(col = "Overall"), method = "lm", se = FALSE)
#> `geom_smooth()` using formula 'y ~ x'
#> `geom_smooth()` using formula 'y ~ x'
Created on 2020-12-11 by the reprex package (v0.3.0)
Обновлено: отвечая на вопросы ниже, это также работает с scale_colour_lancet
:
library(ggplot2)
library(dplyr)
iris %>%
modelr::add_predictions(model = lm(Sepal.Length ~ Sepal.Width + Species,
data = iris)) %>%
ggplot(aes(x = Sepal.Width, y = Sepal.Length, col = Species)) +
geom_point() +
theme_classic() +
geom_line(aes(y = pred)) +
geom_smooth(aes(col = "Overall"), method = "lm", se = FALSE) +
ggsci::scale_color_lancet()
#> `geom_smooth()` using formula 'y ~ x'
Created on 2020-12-12 by the reprex package (v0.3.0)
geom_smooth
, использованный выше, автоматически выполняет lm(y ~ x)
для каждой группы, в этом случае давая эквивалентные строки для lm(Sepal.Length ~ Sepal.Width*Species)
. Чтобы получить lm(Sepal.Length ~ Sepal.Width + Species)
, простым способом было бы использовать modelr::add_predictions()
для создания переменной pred
для значений y перед передачей в ggplot
.
Здравствуйте, Андрей, спасибо за помощь! Еще один вопрос по моему набору данных. Категория «Общие» не отображается в легенде? Есть дополнительный шаг?
Есть несколько вариантов того, почему это может быть - в приведенном выше примере это выглядит так, как вызовы aes(col)
между двумя geom_smooth()
естественным образом добавляют «В целом» в список разрывов для перехода к легенде. Если вы используете scale_colour_manual
и не присваиваете ему значение, оно может не отображаться. Кроме того, убедитесь, что он указан в скобках aes()
. Если вы все еще застряли, не стесняйтесь добавить новый код к своему вопросу, чтобы увидеть, не пропало ли что-то.
В качестве альтернативы, если у вас есть пример вашего набора данных, который вы можете опубликовать, мы можем попробовать ваши данные?
Я использую scale_colour_lancet()
Нужно ли это корректировать? Могу я также спросить, как добавить следующие линии регрессии, предоставляемые функцией lm(Sepal.Length~Sepal.Width + Species)
для каждого вида?
сделал маленькое редактирование, чтобы посмотреть, поможет ли это. scale_colour_lancet
как указано выше, добавляет метку «В целом». Кроме того, чтобы получить эту конкретную формулу, которую вы описали, я думаю, вам нужно будет сделать прогнозы, прежде чем переходить к ggplot
. Это работает? Также опубликуйте последний код, если он все еще не работает, и мы сможем увидеть, есть ли ошибка или отсутствующий элемент.
Я определил проблему, почему комбинезон не появляется в легенде. Если сделать geom_smooth(aes(col = "Overall"), method = "lm", linetype = "dashed", se = FALSE)
Появляется, но удаляется, одна из категорий становится пустой. Если я делаю geom_smooth(aes(col = "Overall"), method = "lm", colour = "black", linetype = "dashed", se = FALSE)
, это не отображается. у меня 9 категорий
Ах, это имеет смысл! Согласно файлу справки, в палитре Lancet всего 9 цветов. Таким образом, он не может назначить 10 уникальных цветов и впоследствии отбрасывает один. Тогда подойдет другая палитра, если она будет содержать более 10 цветов.
Потрясающий! Большое спасибо
Если у меня есть фрейм данных, содержащий столбцы Ширина, Длина, Цвет. Со значениями в цвете - красный, синий, зеленый. Я использую следующую регрессию: lm(Width~Length+Colour, df)
Я хотел бы изменить контрольный уровень фиктивной переменной на зеленый.
решение будет заключаться в изменении уровней фактора Colour
, чтобы сделать «зеленый» базовым уровнем. Если это уже фактор, вы можете использовать mutate(Colour = forcats::fct_relevel(Colour, "green"))
или создать фактор из символьной переменной и сделать зеленый первый случай. Надеюсь, это работает! Теперь это превращается в совершенно другой вопрос - если у вас есть дальнейшие проблемы с переупорядочением факторов, задайте новый вопрос. Дает больше места для работы, а не упаковывает все в комментарии :)
(PS - если вам нравятся цвета палитры Lancet и вы хотите выжать из нее десятый цвет, вы можете заменить scale_colour_lancet
на scale_colour_manual(values = colorRampPalette(pal_lancet()(9))(10))
- это берет 9 цветов палитры Lancet и перемешивает их, чтобы получить 10 в том же грубом спектре. )
Привет, я хотел добавить регрессию к моему графику с большим количеством переменных, например. lm(Sepal.Length ~ Sepal.Width + Petal Width + Species), где «вид» — фиктивная переменная. Я хочу, чтобы линия регрессии показывала коэффициент Sepal.Width для всех видов, когда все остальные переменные остаются постоянными.
Добавьте код для воспроизведения минимальной версии набора данных df.