R语言 在旋转坐标系上找到一条轴线

dvtswwa3  于 2024-01-03  发布在  其他
关注(0)|答案(1)|浏览(117)

假设x和y是均匀分布的,如代码所示:

  1. library(ggplot2)
  2. library(rearrr)
  3. #> Warning: package 'rearrr' was built under R version 4.3.2
  4. x <- runif(2000, min = 0, max = 1)
  5. y <- runif(2000, min = -0.4, max = 0.4)
  6. df <- data.frame(x = x, y = y)
  7. dfr <- rotate_2d(df, -30, origin = c(0.5, 0), x_col = "x", y_col = "y")
  8. ggplot(dfr) + geom_point(aes(x, y)) + geom_smooth(aes(x, y), method = "lm", formula = y ~ x)

字符串
我们可以很容易地做一个线性回归来近似点的轴线:

但是当我们将所有的点围绕中心点旋转一定的Angular 后,线性回归就不能做到了:

  1. ggplot(dfr) + geom_point(aes(x_rotated, y_rotated)) +
  2. geom_smooth(aes(x_rotated, y_rotated), method = "lm", formula = y ~ x)

创建于2023-12-31使用reprex v2.0.2
是否有一种方法可以找到旋转Angular (可能还有中心点)并正确绘制红色所示的轴线?

fdbelqdn

fdbelqdn1#

与@SamR的方法相同的想法,但略有不同,因为我使用单独的数据框架拟合值,并使用geom_polygon添加置信带,因为旋转下限和上限后不再共享相同的x坐标(因此geom_ribbon将不再有效):

  1. library(ggplot2)
  2. library(rearrr)
  3. set.seed(123)
  4. degree <- -30
  5. n <- 200
  6. x <- runif(2000, min = 0, max = 1)
  7. y <- runif(2000, min = -0.4, max = 0.4)
  8. df <- data.frame(x = x, y = y)
  9. dfr <- rotate_2d(df, degree, origin = c(0.5, 0), x_col = "x", y_col = "y")
  10. mod <- lm(y ~ x, data = df)
  11. df_fit <- data.frame(
  12. x = seq(0, 1, length.out = n)
  13. )
  14. df_fit[c("y", "ymin", "ymax")] <-
  15. predict(mod, newdata = df_fit, interval = "confidence")
  16. cols <- c("y", "ymin", "ymax")
  17. dfr_fit <- lapply(cols, \(y) {
  18. dfr <- rotate_2d(df_fit, degree,
  19. origin = c(0.5, 0),
  20. x_col = "x", y_col = y
  21. )
  22. dfr <- dfr[c("x_rotated", paste0(y, "_rotated"))]
  23. names(dfr) <- c("x_rotated", "y_rotated")
  24. dfr
  25. })
  26. dfr_ribbon <- rbind(
  27. dfr_fit[[2]],
  28. dfr_fit[[3]][rev(seq(n)), ]
  29. )
  30. ggplot(dfr, aes(x_rotated, y_rotated)) +
  31. geom_point(alpha = .4, size = .5) +
  32. geom_polygon(data = dfr_ribbon, fill = "red", alpha = .4) +
  33. geom_line(data = dfr_fit[[1]], color = "#3366FF", linewidth = 1)

字符串

展开查看全部

相关问题