Это не очень хорошее решение по причине, которую я объясню позже.Но он делает именно то, о чем спрашивает вопрос.
Сначала вспомогательная функция.
#
# computes the intersection point of the
# line passing through x perpendicular to
# the line defined by PQ
#
perp_line <- function(x, P, Q){
a <- Q[2] - P[2]
b <- -(Q[1] - P[1])
A <- matrix(c(a, b, b, -a), nrow = 2)
c1 <- -b*P[2] - a*P[1]
c2 <- -b*x[1] + a*x[2]
cc <- c(-c1, -c2)
solve(A, cc)
}
Теперь используйте функцию, чтобы получить координаты требуемой точки и нарисовать отрезок линии от синей точки до вычисленной.
X <- unlist(df[1, ])
Y <- unlist(df[nrow(df), ])
Z <- perp_line(c(21, 0.37), X, Y)
df %>%
ggplot(aes(x, y)) +
geom_point(shape = 21, size = 4) +
geom_smooth(data = filter(df, row_number() %in% c(1, n())), method = "lm") +
geom_point(aes(x = 21, y = .37), shape = 21, size = 4, fill = "blue") +
geom_segment(aes(x = x2, y = y2, xend = Z[1], yend = Z[2])) +
#coord_fixed(ratio = 1) +
theme_light()
Как видно из графика, соотношение сторон ужасное.Ваш диапазон осей x
и y
настолько различен, что линии кажутся совсем не перпендикулярными.Раскомментируйте строку кода coord_fixed
, чтобы получить лучшее соотношение сторон, но тогда вы ничего не увидите.
![enter image description here](https://i.stack.imgur.com/EaxPO.png)