如何使用 PCA 计算的值作为 R 中轴的 ggplot 标签

问题描述 投票:0回答:1

当我在 R 中运行主成分分析,然后在 ggplot 中绘制 2 个 PC 时,我希望能够让轴标签自动包含轴上的 PC # 及其解释的变异百分比。现在当我切换到不同的电脑时,我必须手动更改标签。

我在这里有示例代码(我遗漏了相当多的代码,我认为这些代码与问题无关,但如果我弄错了,请告诉我):

# Example dataset SR
SR = structure(list(Site_ID = 1:6, A = c(0.102, 1.34, 0.875, 0.564, 
0.075, 0.141), B = c(0.01, 0.05, 0.021, 0.018, 0.006, 0.144), 
    C = c(1.329, 2.029, 2.466, 6.648, 0.735, 2.49), D = c(0.025, 
    0.045, 0.039, 0.024, 0.045, 0.112), E = c(0.007, 0.001618893, 
    0.022, 0.018, 0.006, 0.035), F = c(17.52188, 27.412, 18.69, 
    118.8684, 9.7188, 2.9904)), class = "data.frame", row.names = c(NA, 
-6L))

##### PCA calcuation ##############################################

SR.pca <- prcomp(SR, scale=TRUE, retx=TRUE)
PCAvalues <- summary(SR.pca)

#Example output
#Importance of components:
#                          PC1    PC2    PC3     PC4     PC5       PC6
#Standard deviation     2.3467 2.1712 1.8408 1.12707 1.05835 8.756e-16
#Proportion of Variance 0.3442 0.2946 0.2118 0.07939 0.07001 0.000e+00
#Cumulative Proportion  0.3442 0.6388 0.8506 0.92999 1.00000 1.000e+00

summ <- summary(SR.pca)$importance[2,] 
#gives proportion of variance for each PC
summ

#Example output
#PC1     PC2     PC3     PC4     PC5     PC6 
#0.34420 0.29463 0.21178 0.07939 0.07001 0.00000

###### Graph the PCA ########

library(ggplot2)
ggplot(PCAvalues, aes(x = PC1, y = PC2)) +
  geom_text(data=PCAvalues, aes(x = PC1, y = PC2, label=Site_ID), size=2)+
  scale_color_gradient(low = "red", high = "blue") + 
  coord_equal() +
  labs(color="Dist. Grad.")+
  theme_bw() 
 # + labs(y = "PC2 (29.46%)", x = "PC1 (34.42%)")

现在,每次更改正在绘制的 PC 时,我都必须手动更改最后一行代码。如果它能以某种方式从 ggplot(PCAvalues, aes(x = PC1, y = PC2)) 中获取 PC #(即 PC2),并从标签的 summ 中获取 %,那就太棒了。

r ggplot2 pca axis-labels
1个回答
0
投票

我无法运行你的代码,因为 PCAvalues 是一个列表,而不是数据框,并且 ggplot() 无法使用它。 下面是一个函数示例,该函数采用数据框、两列的名称和命名向量,并根据标有列名称和命名向量中的相应值的数据框绘制绘图。我认为这符合你的数据。

library(ggplot2)
DF <- data.frame(PC1 = rnorm(10), PC2 = rnorm(10), PC3 = rnorm(10))
summ <- c(PC1 = 42.3, PC2 = 23.0, PC3 = 5.2)

plotFunc <- function(DATA, col1, col2, vec) {
  label1 = paste(col1, round(vec[col1],2), "%")
  label2 = paste(col2, round(vec[col2],2), "%")
  ggplot(DATA, aes(.data[[col1]], .data[[col2]])) + geom_point() +
    labs(x = label1, y = label2)
}
plotFunc(DF, "PC1","PC3", summ)

Scatter plot

创建于 2024 年 11 月 20 日,使用 reprex v2.1.1

© www.soinside.com 2019 - 2024. All rights reserved.