#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
, вероятно, требуется.)
Быстрый способ найти группы здесь:
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()
(У него все та же проблема с количеством фигур, но это легко обойти.)