使用ggplot2 / ggfortify更改PCA图中的加载(箭头)长度?
我一直在努力在ggplot2 / ggfortify PCA中重新调整加载(箭头)长度。 我周围环顾四周寻找答案,唯一的信息是我已经发现代码新的双触发函数或者引用PCA(ggbiplot,factoextra)的其他完全不同的包,这两个都不能解决我想回答的问题:
是否可以在ggfortify中缩放/更改PCA加载的大小?
以下是我必须使用库存R函数绘制PCA的代码以及使用autoplot / ggfortify绘制PCA的代码。 您会注意到在股票R图中,我可以通过简单乘以标量(* 20)来缩放载荷,这样我的箭头就不会在PCA图的中间变得局促。 使用autoplot ...不是那么多。 我错过了什么? 如果有必要,我会移动到另一个包,但真的想更好地理解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软件包,则可以将其复制。 下面的图表。
R我想要ggplot的样子
ggplot实际上是什么样子
这个答案可能在OP需要之后很长时间,但是我提供这个答案是因为我一直在争论相同的问题,也许我可以为其他人节省相同的努力。
# Load data
DATA <- data.frame(iris)
# Do PCA
PCA <- prcomp(iris[,1:4])
# Extract PC axes for plotting
PCAvalues <- data.frame(Species = iris$Species, PCA$x)
# Extract loadings of the variables
PCAloadings <- data.frame(Variables = rownames(PCA$rotation), PCA$rotation)
# Plot
ggplot(PCAvalues, aes(x = PC1, y = PC2, colour = Species)) +
geom_segment(data = PCAloadings, aes(x = 0, y = 0, xend = (PC1*5),
yend = (PC2*5)), arrow = arrow(length = unit(1/2, "picas")),
color = "black") +
geom_point(size = 3) +
annotate("text", x = (PCAloadings$PC1*5), y = (PCAloadings$PC2*5),
label = PCAloadings$Variables)
为了增加箭头长度,请将geom_segment
调用中xend
和yend
的负载相乘。 通过一些尝试和努力,可以计算出使用的数字。
要将标签放置在正确的位置,请在annotate
调用中将PC轴乘以相同的值。
上一篇: Change loadings (arrows) length in PCA plot using ggplot2/ggfortify?