我想知道是否可以用ggplot2繪製pca雙線圖結果。假設我想用ggplot2顯示以下雙曲線結果用ggplot2繪製pca雙線圖
fit <- princomp(USArrests, cor=TRUE)
summary(fit)
biplot(fit)
任何幫助將不勝感激。由於
我想知道是否可以用ggplot2繪製pca雙線圖結果。假設我想用ggplot2顯示以下雙曲線結果用ggplot2繪製pca雙線圖
fit <- princomp(USArrests, cor=TRUE)
summary(fit)
biplot(fit)
任何幫助將不勝感激。由於
也許這將幫助 - 從代碼我寫了一些時間回到它的適應。它現在也繪製箭頭。
PCbiplot <- function(PC, x="PC1", y="PC2") {
# PC being a prcomp object
data <- data.frame(obsnames=row.names(PC$x), PC$x)
plot <- ggplot(data, aes_string(x=x, y=y)) + geom_text(alpha=.4, size=3, aes(label=obsnames))
plot <- plot + geom_hline(aes(0), size=.2) + geom_vline(aes(0), size=.2)
datapc <- data.frame(varnames=rownames(PC$rotation), PC$rotation)
mult <- min(
(max(data[,y]) - min(data[,y])/(max(datapc[,y])-min(datapc[,y]))),
(max(data[,x]) - min(data[,x])/(max(datapc[,x])-min(datapc[,x])))
)
datapc <- transform(datapc,
v1 = .7 * mult * (get(x)),
v2 = .7 * mult * (get(y))
)
plot <- plot + coord_equal() + geom_text(data=datapc, aes(x=v1, y=v2, label=varnames), size = 5, vjust=1, color="red")
plot <- plot + geom_segment(data=datapc, aes(x=0, y=0, xend=v1, yend=v2), arrow=arrow(length=unit(0.2,"cm")), alpha=0.75, color="red")
plot
}
fit <- prcomp(USArrests, scale=T)
PCbiplot(fit)
您可能想要更改文本的大小以及透明度和顏色以供品嚐;使它們成爲函數的參數很容易。 注意:我發現它適用於prcomp,但您的示例是princomp。您可能再次需要相應地調整代碼。 注2:geom_segment()
的代碼是從評論鏈接到OP的郵件列表帖子中借用的。
我想添加觀察的名稱以及變量的箭頭。任何想法? – MYaseen208
完成 - 希望它有幫助! – crayola
ggplot2版本0.9的小更新,現在需要添加庫(「ggplot2」)和庫(「網格」)來繪製箭頭。 –
這將讓各州繪製,雖然不是變量
fit.df <- as.data.frame(fit$scores)
fit.df$state <- rownames(fit.df)
library(ggplot2)
ggplot(data=fit.df,aes(x=Comp.1,y=Comp.2))+
geom_text(aes(label=state,size=1,hjust=0,vjust=0))
好的嘗試。如何用箭頭添加變量? – MYaseen208
@亨利 任何類似的解決方案爲pls biplot? http://stackoverflow.com/questions/39137287/plotting-pls-biplot-with-ggplot2 – aelwan
如果您使用優秀FactoMineR
包PCA,你可能會發現這很有用ggplot2
# Plotting the output of FactoMineR's PCA using ggplot2
#
# load libraries
library(FactoMineR)
library(ggplot2)
library(scales)
library(grid)
library(plyr)
library(gridExtra)
#
# start with a clean slate
rm(list=ls(all=TRUE))
#
# load example data from the FactoMineR package
data(decathlon)
#
# compute PCA
res.pca <- PCA(decathlon, quanti.sup = 11:12, quali.sup=13, graph = FALSE)
#
# extract some parts for plotting
PC1 <- res.pca$ind$coord[,1]
PC2 <- res.pca$ind$coord[,2]
labs <- rownames(res.pca$ind$coord)
PCs <- data.frame(cbind(PC1,PC2))
rownames(PCs) <- labs
#
# Just showing the individual samples...
ggplot(PCs, aes(PC1,PC2, label=rownames(PCs))) +
geom_text()
#
# Now get supplementary categorical variables
cPC1 <- res.pca$quali.sup$coor[,1]
cPC2 <- res.pca$quali.sup$coor[,2]
clabs <- rownames(res.pca$quali.sup$coor)
cPCs <- data.frame(cbind(cPC1,cPC2))
rownames(cPCs) <- clabs
colnames(cPCs) <- colnames(PCs)
#
# Put samples and categorical variables (ie. grouping
# of samples) all together
p <- ggplot() + opts(aspect.ratio=1) + theme_bw(base_size = 20)
# no data so there's nothing to plot...
# add on data
p <- p + geom_text(data=PCs, aes(x=PC1,y=PC2,label=rownames(PCs)), size=4)
p <- p + geom_text(data=cPCs, aes(x=cPC1,y=cPC2,label=rownames(cPCs)),size=10)
p # show plot with both layers
#
# clear the plot
dev.off()
#
# Now extract variables
#
vPC1 <- res.pca$var$coord[,1]
vPC2 <- res.pca$var$coord[,2]
vlabs <- rownames(res.pca$var$coord)
vPCs <- data.frame(cbind(vPC1,vPC2))
rownames(vPCs) <- vlabs
colnames(vPCs) <- colnames(PCs)
#
# and plot them
#
pv <- ggplot() + opts(aspect.ratio=1) + theme_bw(base_size = 20)
# no data so there's nothing to plot
# put a faint circle there, as is customary
angle <- seq(-pi, pi, length = 50)
df <- data.frame(x = sin(angle), y = cos(angle))
pv <- pv + geom_path(aes(x, y), data = df, colour="grey70")
#
# add on arrows and variable labels
pv <- pv + geom_text(data=vPCs, aes(x=vPC1,y=vPC2,label=rownames(vPCs)), size=4) + xlab("PC1") + ylab("PC2")
pv <- pv + geom_segment(data=vPCs, aes(x = 0, y = 0, xend = vPC1*0.9, yend = vPC2*0.9), arrow = arrow(length = unit(1/2, 'picas')), color = "grey30")
pv # show plot
#
# clear the plot
dev.off()
#
# Now put them side by side
#
library(gridExtra)
grid.arrange(p,pv,nrow=1)
#
# Now they can be saved or exported...
#
# tidy up by deleting the plots
#
dev.off()
這裏做圖是最終的情節看起來像什麼,也許是文字大小上左邊的圖可能會更小一些:
這裏是通過ggbiplot
最簡單的方法:
library(ggbiplot)
fit <- princomp(USArrests, cor=TRUE)
biplot(fit)
ggbiplot(fit, labels = rownames(USArrests))
因爲這不是在CRAN中,所以下面是如何獲取包: '庫(devtools); install_github( 「vqv/ggbiplot」)'。這絕對是最好的答案;我想知道它是否會被最初的醜陋的「biplot」所掩蓋?這是我第一次在小屏幕上看到的,在滾動到'ggbiplot'之前幾乎忽略了它。 –
您還可以使用factoextra其中也有GGPLOT2後端:
library("devtools")
install_github("kassambara/factoextra")
fit <- princomp(USArrests, cor=TRUE)
fviz_pca_biplot(fit)
或者ggord
:
install_github('fawda123/ggord')
library(ggord)
ggord(fit)+theme_grey()
或者ggfortify
:
devtools::install_github("sinhrks/ggfortify")
library(ggfortify)
ggplot2::autoplot(fit, label = TRUE, loadings.label = TRUE)
[這](http://groups.google.com/group/ GGPLOT2/browse_thread /線程/ 5fea365578c3910f/47A e63e7ff18508e)ggplot2郵件列表中的線程可能是一個很好的開始。 – joran
我建議接受MYaseen208關於'ggbiplot'軟件包的回答。我已經開始調整crayola的答案(這很好,但是沒有必要考慮包)來執行'ggbiplot'中已有的東西(例如去除標籤)。 –