问题描述
我正在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}}