4

我想使用autoplot()package的功能来绘制 PC2 和 PC3 的图ggfortify。默认只显示 PC1 和 PC2:

library(ggfortify)
myPCA <- prcomp(iris[-5])
autoplot(myPCA)

我可以通过重新排序和重命名 prcomp 对象中的列来得到我想要的:

myPCAtrunc <- myPCA
myPCAtrunc[[1]] <- myPCAtrunc[[1]][c(2,3,1,4)]
myPCAtrunc[[2]] <- myPCAtrunc[[2]][,c(2,3,1,4)]
colnames(myPCAtrunc[[2]]) <- c("PC1","PC2","PC3","PC4") # fake names
myPCAtrunc[[5]] <- myPCAtrunc[[5]][,c(2,3,1,4)]
colnames(myPCAtrunc[[5]]) <- c("PC1","PC2","PC3","PC4") # fake names
autoplot(myPCAtrunc, xlab = "PC2", ylab="PC3")

我知道这是正确的,因为它与plot(myPCA$x[, c(2,3)]).

但是必须有一种更清洁的方法来解决它。一些想法?

4

3 回答 3

15

最近解决了这个问题(这里)。

autoplot(myPCA,    # your prcomp object
         x = 2,    # PC2
         y = 3)    # PC3
于 2017-04-26T23:35:00.117 回答
1

查看被调用的方法时,它看起来像是设计为仅绘制 PC1 和 PC2:

getS3method("autoplot", class(myPCA) )
> ...
> if (is_derived_from(object, "prcomp")) {
>        x.column <- "PC1"
>        y.column <- "PC2"
>       loadings.column <- "rotation"
>    }
> ...

如果这是你的一个选项,我建议你使用ggbiplot包并设置choices参数:

library(ggbiplot)
ggbiplot(myPCA, choices = 2:3 , var.axes =FALSE)

在此处输入图像描述

于 2016-03-09T12:01:53.653 回答
1

你能做的只是修改你的 prcomp 对象。然后像这样更改 y 标签:

pca_test=pca
pca_test$x=pca_test$x[,c(1,3)]
colnames(pca_test$x)=c("PC1","PC2")
pca_test$rotation=pca_test$rotation[,c(1,3)]
colnames(pca_test$rotation)=c("PC1","PC2")

autoplot(pca_test,data=df,colour='study',shape='species')+scale_color_manual(values=c("Red","Blue","Green","Purple","Brown","Orange","Black"))+scale_fill_manual(values=c("Red","Blue","Green","Purple","Brown","Orange","Black"))+theme_bw()+ylab("PC3")

希望它有帮助!

JC

于 2017-02-17T15:59:38.027 回答