#r #ggplot2
Вопрос:
Я хотел бы показать среднее значение двух групп на диаграмме рассеяния. Я отсортировал данные так, чтобы группы находились рядом друг с другом. Группа 1-это первые 11 записей, а группа 2-следующие 133. Как я могу сказать ggplot, чтобы он провел одну линию поперек диапазона для первой группы (Дом 1-11) и вторую линию для второй (Дом 12-133).
Вот что у меня есть до сих пор:
И код здесь:
library(tidyverse)
library(tidymodels)
data(ames)
ames <- AmesHousing::make_ames()
set.seed(1)
split <- initial_split(ames, prop = 0.95, strata = "Sale_Price")
ames_plot <- testing(split)
model1 <- lm(Sale_Price ~ Central_Air, data = ames_plot)
p1 <- model1 %>%
broom::augment() %>%
arrange(Central_Air) %>%
mutate(House = row_number()) %>%
ggplot(aes(House, Sale_Price, color = Central_Air))
geom_point(size = 1, alpha = 0.3)
geom_segment(aes(x = 1, y = .fitted, xend = 144, yend =.fitted))
scale_y_continuous(labels = scales::dollar)
p1
Использование geom_smooth(formula = 'y ~ x', se = FALSE, method = "lm")
вместо geom_segment()
приближает меня к тому, что я хочу, но я хочу показать фактические прогнозируемые значения, полученные из lm()
.
Ответ №1:
Было бы лучше всего просто обобщить ваши данные для этого слоя. Например
model1 %>%
broom::augment() %>%
arrange(Central_Air) %>%
mutate(House = row_number()) %>%
ggplot(aes(House, Sale_Price, color = Central_Air))
geom_point(size = 1, alpha=.3)
geom_segment(aes(x = first, y = .fitted, xend = last, yend =.fitted),
data = function(x) {
x %>%
group_by(Central_Air) %>%
summarize(first=first(House), last=last(House), .fitted=mean(.fitted), .groups="drop_last")
})
scale_y_continuous(labels = scales::dollar)