Нарисуйте диагональную линию от определенной geom_point () в ggplot2 - PullRequest
1 голос
/ 17 марта 2019

Я хотел бы нарисовать диагональную линию, начиная с определенного geom_point() в ggplot2. Линия будет начинаться от точки (x = 21, y = 0.37) и заканчиваться диагональной линией, образованной между первой и последней точкой (см. Ниже:)

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(ggplot2)

df <- structure(list(x = c(0, 8, 12, 16, 20, 24, 28, 32, 33.33), y = c(0.2, 
                                                                       0.212, 0.22, 0.26, 0.339, 0.452, 0.654, 1.001, 1.155)), class = c("tbl_df", 
                                                                                                                                         "tbl", "data.frame"), row.names = c(NA, -9L))

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") +
  theme_light()
#> Warning in qt((1 - level)/2, df): NaNs produced

Создано в 2019-03-17 пакетом Представление (v0.2.1)

EDIT:

Пример результата, который я ищу:

enter image description here

1 Ответ

2 голосов
/ 17 марта 2019

Это не очень хорошее решение по причине, которую я объясню позже.Но он делает именно то, о чем спрашивает вопрос.

Сначала вспомогательная функция.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...