добавление группового значения к geom_point() в ggplot

#r #ggplot2

#r #ggplot2

Вопрос:

Мне было интересно, могу ли я добавить (наложить) mean каждого столбца точек (используя разные формы, например, прямоугольники, квадраты, треугольники и т.д.) На график ниже?

 library(ggplot2)
hsb <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/hsb.csv')
ten <- subset(hsb, sch.id %in% unique(sch.id)[1:10]) # get 10 schools for display
ten %>% ggplot()   aes(meanses, math)   geom_point()   geom_smooth(method = "lm", se = FALSE)
  

введите описание изображения здесь

Ответ №1:

Я продемонстрирую начальный метод, но его недостаток в том, что я делаю вывод, что округления meanses достаточно для правильной группировки объектов. Если это не всегда так «чисто», то вам, вероятно, понадобится и дешевая кластеризация.

 means <- group_by(ten, g = format(round(meanses, 1))) %>%
  summarize(meanses = first(meanses), math = mean(math))
ggplot(ten, aes(meanses, math))  
  geom_point()  
  geom_smooth(method = "lm", se = FALSE)  
  geom_point(data = means, aes(shape = g), color = "red", size = 5)
# `geom_smooth()` using formula 'y ~ x'
# Warning: The shape palette can deal with a maximum of 6 discrete values because more than 6 becomes
# difficult to discriminate; you have 7. Consider specifying shapes manually if you must
# have them.
# Warning: Removed 1 rows containing missing values (geom_point).
  

(Нам также нужно еще несколько фигур … scale_shape_manual , вероятно, требуется.)

ggplot2 с групповыми средними


Быстрый способ найти группы здесь:

 grps <- sort(unique(round(ten$meanses, 3)))
grps[c(FALSE, diff(grps) < 0.01)] <- NA
grps <- grps[!is.na(grps)]
means <- ten %>%
  group_by(grp = format(grps[ apply(abs(outer(meanses, grps, `-`)), 1, which.min) ])) %>%
  summarize(meanses = first(meanses), math = mean(math)) %>%
  ungroup()
  

(У него все та же проблема с количеством фигур, но это легко обойти.)