使用ggplot2 / ggfortify改变PCA图中的载荷(箭头)长度?

时间:2016-03-10 18:09:01

标签: r ggplot2 pca ggfortify

我一直在努力重新调整ggplot2 / ggfortify PCA中的加载(箭头)长度。我已经广泛地浏览了这个问题的答案,我发现的唯一信息是编写新的双标函数或者参考其他完全不同的PCA包(ggbiplot,factoextra),这些都没有解决我想回答的问题:

是否可以在ggfortify中扩展/更改PCA载入的大小?

下面是我使用股票R函数绘制PCA的代码以及使用autoplot / ggfortify绘制PCA的代码。你会注意到在股票R图中我可以通过简单地乘以一个标量(这里是* 20)来缩放载荷,所以我的箭头在PCA图的中间没有狭窄。使用autoplot ......不是那么多。我错过了什么?如果有必要,我会转到另一个包,但是我真的希望更好地了解ggfortify。

在我发现的其他网站上,图形轴限制似乎永远不会超过+/- 2.我的图形变为+/- 20,并且载荷稳定地接近0,可能与具有较小轴的图形具有相同的比例。我仍然希望使用ggplot2绘制PCA,但如果ggfortify不会这样做,那么我需要找到另一个包./ / p>

#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

1 个答案:

答案 0 :(得分:2)

这个答案可能在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)

enter image description here

为了增加箭头长度,请在xend调用中乘以yendgeom_segment的加载。通过一些试验和努力,可以计算出使用的数字。

要将标签放置在正确的位置,请将PC轴乘以annotate调用中的相同值。