В ggplot как построить среднюю линию для двух групп на диаграмме рассеяния

#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)