当我在 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 中获取 %,那就太棒了。
我无法运行你的代码,因为 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)
创建于 2024 年 11 月 20 日,使用 reprex v2.1.1