从ggfortify中的自动绘图中为PCA复制负载

问题描述

我正在autoplot中使用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[,y = cars_pca$rotation[,2],col = alpha('red',0.7),cex = 1,labels = colnames(mtcars))

我已经读到R可以互换使用术语加载和特征向量,即使这并不精确。但是,即使手动实现这些two questions中的详细信息,我也无法生成ggfortify双图。我还尝试寻找ggfortify::autoplot.prcomp的源代码,但是没有运气。

有人可以给我一些有关如何重现ggfortify正在绘制的载荷的建议吗?我真的很想了解发生了什么事。

谢谢!

解决方法

转换在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[,y = trans2[,2],col = alpha('red',0.7),cex = 1,labels = colnames(mtcars)) 函数中转换

{{1}}

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...