我一直在努力调整ggplot2/ggfortify PCA中的加载(箭头)长度。我已经广泛地寻找了这个问题的答案,我找到的唯一信息要么是编写新的biplot函数,要么是引用其他完全不同的PCA包(ggbiplot,factoextra),这两个包都没有解决我想要回答的问题:
是否可以在ggfortify中缩放/更改PCA加载的大小?
下面是使用stock R函数绘制PCA的代码,以及使用autoplot/ggfortify绘制PCA的代码。您将注意到,在股票R图中,我可以通过简单地乘以标量(这里是*20)来缩放负载,这样我的箭头就不会被夹在PCA图的中间。使用autoplot...not太多了。我遗漏了什么?如果有必要,我会转到另一个包,但我真的希望对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 plot of what I want ggplot to look like
What ggplot actually looks like
编辑:在下面添加可重现的代码。
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()发布于 2018-03-29 01:56:06
这个答案可能是在OP需要它之后很久才有的,但我之所以提供它,是因为我已经为同一个问题纠结了一段时间,也许我可以省去其他人同样的努力。
# Load data
iris <- 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的负载相乘。通过一些尝试和努力,就可以确定要使用的数字。
要将标签放在正确的位置,请将PC轴乘以annotate调用中的相同值。
https://stackoverflow.com/questions/35924085
复制相似问题