我在ggfortify中使用ggfortify来绘制prcomp对象。我还想看看我是否能手工复制这个情节。然而,当我这样做时,这两幅图在如何绘制负载方面似乎有所不同。请注意,这里没有缩放数据集。我实际上正在做这个练习的数据集对所有列都有相同的单位,我认为不缩放可能是结果。
library(ggplot2)
library(ggfortify)
data(mtcars)
cars_pca = prcomp(mtcars, center = TRUE, scale. = FALSE)
autoplot(cars_pca, loadings = TRUE, loadings.label = TRUE)
plot(x = cars_pca$x[, 1], y = cars_pca$x[, 2])
text(x = cars_pca$rotation[, 1],
y = cars_pca$rotation[, 2],
col = alpha('red', 0.7),
cex = 1,
labels = colnames(mtcars))我读过R交替使用加载和特征向量这两个术语,即使这并不精确。但是,即使在手动实现这些ggfortify questions中的详细内容时,我也无法生成two双图。我也尝试寻找ggfortify::autoplot.prcomp的源代码,但没有成功。
有人能给我一些关于如何重现ggfortify正在绘制的加载的建议吗?我真的很想了解到底发生了什么。
谢谢!
发布于 2020-09-08 03:12:08
转换正在ggfortify::autoplot.prcomp函数中进行。因为您使用的是scale=1的默认值,所以会对值进行调整。下面是如何恢复autoplot期间绘制的相同点。加载在ggfortify::ggbiplot函数中转换。
scaler <- cars_pca$sdev[c(1,2)] * sqrt(nrow(cars_pca$x))
trans <- t(t(cars_pca$x[, 1:2]) / scaler)
scaler2 <- min(max(abs(trans[, 1L])) / max(abs(cars_pca$rotation[, 1L])),
max(abs(trans[, 2L])) / max(abs(cars_pca$rotation[, 2L])))
trans2 <- cars_pca$rotation[, 1L:2L] * scaler2 * 0.8
plot(x = trans[, 1], y = trans[, 2])
text(x = trans2[, 1],
y = trans2[, 2],
col = alpha('red', 0.7),
cex = 1,
labels = colnames(mtcars))

https://stackoverflow.com/questions/63786339
复制相似问题