我一直在努力重新调整 ggplot2/ggfortify PCA 中的载荷(箭头)长度。我已经四处寻找答案,我发现的唯一信息要么编写新的 biplot 函数,要么参考其他完全不同的 PCA 包(ggbiplot,factoextra),这两者都没有解决我想回答的问题:
是否可以在 ggfortify 中缩放/更改 PCA 负载的大小?
下面是我必须使用股票 R 函数绘制 PCA 的代码,以及使用 autoplot/ggfortify 绘制 PCA 的代码。您会注意到,在股票 R 图中,我可以通过简单地乘以标量(此处为 *20)来缩放负载,这样我的箭头就不会在 PCA 图的中间狭窄。使用自动绘图...不是那么多。我错过了什么?如有必要,我会转到另一个包,但我真的很想更好地了解 ggfortify。
在我发现的其他网站上,图表轴限制似乎从未超过 +/- 2。我的图表变为 +/- 20,并且负载稳定地位于 0 附近,大概与具有较小轴的图表具有相同的比例。我仍然想使用 ggplot2 绘制 PCA,但如果 ggfortify 不这样做,那么我需要找到另一个包。
#load data geology rocks frame
georoc <- read.csv("http://people.ucsc.edu/~mclapham/earth125/data/georoc.csv")
#load libraries
library(ggplot2)
library(ggfortify)
geo.na <- na.omit(georoc) #remove NA values
geo_matrix <- as.matrix(geo.na[,3:29]) #create matrix of continuous data in data frame
pca.res <- prcomp(geo_matrix, scale = T) #perform PCA using correlation matrix (scale = T)
summary(pca.res) #return summary of PCA
#plotting in stock R
plot(pca.res$x, col = c("salmon","olivedrab","cadetblue3","purple")[geo.na$rock.type], pch = 16, cex = 0.2)
#make legend
legend("topleft", c("Andesite","Basalt","Dacite","Rhyolite"),
col = c("salmon","olivedrab","cadetblue3","purple"), pch = 16, bty = "n")
#add loadings and text
arrows(0, 0, pca.res$rotation[,1]*20, pca.res$rotation[,2]*20, length = 0.1)
text(pca.res$rotation[,1]*22, pca.res$rotation[,2]*22, rownames(pca.res$rotation), cex = 0.7)
#plotting PCA
autoplot(pca.res, data = geo.na, colour = "rock.type", #plot results, name using original data frame
loadings = T, loadings.colour = "black", loadings.label = T,
loadings.label.colour = "black")
数据来自我正在学习的课程的在线文件,所以如果你安装了 ggplot2 和 ggfortify 包,你可以复制它。下图。
编辑:在下面添加可重现的代码。
iris.res <-
iris %>%
select(Sepal.Length:Petal.Width) %>%
as.matrix(.) %>%
prcomp(., scale = F)
autoplot(iris.res, data = iris, size = 4, col = "Species", shape = "Species",
x = 1, y = 2, #components 1 and 2
loadings = T, loadings.colour = "grey50", loadings.label = T,
loadings.label.colour = "grey50", loadings.label.repel = T) + #loadings are arrows
geom_vline(xintercept = 0, lty = 2) +
geom_hline(yintercept = 0, lty = 2) +
theme(aspect.ratio = 1) +
theme_bw()