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

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

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

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

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

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

ggplot(dfr) + geom_point(aes(x_rotated, y_rotated)) +
  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将不再有效):

library(ggplot2)
library(rearrr)

set.seed(123)

degree <- -30
n <- 200

x <- runif(2000, min = 0, max = 1)
y <- runif(2000, min = -0.4, max = 0.4)
df <- data.frame(x = x, y = y)
dfr <- rotate_2d(df, degree, origin = c(0.5, 0), x_col = "x", y_col = "y")

mod <- lm(y ~ x, data = df)

df_fit <- data.frame(
  x = seq(0, 1, length.out = n)
)

df_fit[c("y", "ymin", "ymax")] <-
  predict(mod, newdata = df_fit, interval = "confidence")

cols <- c("y", "ymin", "ymax")
dfr_fit <- lapply(cols, \(y) {
  dfr <- rotate_2d(df_fit, degree,
    origin = c(0.5, 0),
    x_col = "x", y_col = y
  )
  dfr <- dfr[c("x_rotated", paste0(y, "_rotated"))]
  names(dfr) <- c("x_rotated", "y_rotated")
  dfr
})

dfr_ribbon <- rbind(
  dfr_fit[[2]],
  dfr_fit[[3]][rev(seq(n)), ]
)

ggplot(dfr, aes(x_rotated, y_rotated)) +
  geom_point(alpha = .4, size = .5) +
  geom_polygon(data = dfr_ribbon, fill = "red", alpha = .4) +
  geom_line(data = dfr_fit[[1]], color = "#3366FF", linewidth = 1)

字符串

相关问题