PCA проекционный график с ggplot2

У меня есть график, который демонстрирует идею проекции точек на ось с наибольшей дисперсией. Код в R ниже, и мне нужен начальный указатель, как воспроизвести этот сюжет в ggplot2,

Рисунок 1

# Simulate data
library(mvtnorm)
set.seed(2014)
Sigma <- matrix(data = c(4, 2, 2, 3), ncol=2)
mu <- c(1, 2)
n <- 20
X <- rmvnorm(n = n, mean = mu, sigma = Sigma)

# Run PCA
pca <- princomp(X)
load <- loadings(pca)
slope <- load[2, ] / load[1, ]
cmeans <- apply(X, 2, mean)
intercept <- cmeans[2] - (slope * cmeans[1])

# Plot data & 1st principal component
plot(X, pch = 20, asp = 1)
abline(intercept[1], slope[1])

# Plot perpendicular segments
x1 <- (X[, 2] - intercept[1]) / slope[1]
y1 <- intercept[1] + slope[1] * X[, 1]
x2 <- (x1 + X[, 1]) / 2
y2 <- (y1 + X[, 2]) / 2
segments(X[, 1], X[, 2], x2, y2, col = "red")

1 ответ

Решение

Поместите свою матрицу X и векторы x2 и y2 в один фрейм данных.

df<-data.frame(X,x2,y2)

Затем используйте столбцы X1, X2 в качестве x а также y значения, x2 и y2 как xend= а также yend=, Очки добавляются с geom_point()Подчеркните с geom_abline() и сегменты с geom_segment(), С coord_fixed() Вы гарантируете, что оси x и y имеют одинаковую ширину.

library(ggplot2)
ggplot(df,aes(X1,X2))+
      geom_point()+
      geom_abline(intercept=intercept[1],slope=slope[1])+
      geom_segment(aes(xend=x2,yend=y2),color="red")+
      coord_fixed()

Другие вопросы по тегам