You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于recipes包的PCA对象绘制类似FactoMineR的相关性圆?

用recipes + ggplot2实现FactoMineR风格的PCA可视化

要在tidymodels工作流里复刻FactoMineR的PCA可视化,核心是从预处理好的recipe对象中提取载荷、方差解释率等关键信息,再用ggplot2手动构建图形。以下是完整步骤:

1. 基础准备与PCA建模

先基于标准化变量构建PCA模型(和FactoMineR默认的scale.unit = TRUE保持一致):

library(tidymodels)
library(ggplot2)
library(dplyr)

# 用iris数据集示例
data(iris)

# 构建并拟合PCA recipe
pca_recipe <- recipe(~ ., data = iris) %>%
  step_normalize(all_predictors()) %>% # PCA前标准化变量
  step_pca(all_predictors(), num_comp = 2) %>% # 保留前2个主成分
  prep(training = iris) # 完成预处理拟合

2. 提取可视化所需的关键数据

提取变量载荷(相关性圆核心)

用tidy()函数提取PCA的载荷矩阵,这对应FactoMineR中PCA结果$var$coord的内容:

# 提取PCA载荷:number参数对应step_pca在recipe中的步骤序号(这里是第2步)
pca_loadings <- tidy(pca_recipe, number = 2)

提取主成分方差解释率

用来给坐标轴添加方差占比标注:

# 提取方差解释百分比
pca_variance <- tidy(pca_recipe, number = 2, type = "variance") %>%
  filter(stringr::str_detect(terms, "percent"))

提取样本主成分得分

对应FactoMineR中PCA结果$ind$coord,用于绘制样本散点图:

# 生成样本的主成分得分,并结合分类变量
pca_scores <- bake(pca_recipe, new_data = iris) %>%
  bind_cols(iris %>% select(Species))

3. 绘制相关性圆(复刻FactoMineR的fviz_pca_var)

相关性圆的原理是用变量与主成分的相关系数(即载荷)绘制向量,同时添加单位圆辅助判断变量对主成分的贡献:

ggplot(pca_loadings, aes(x = value, y = value.1)) +
  # 绘制变量向量
  geom_segment(aes(x = 0, y = 0, xend = value, yend = value.1),
               arrow = arrow(length = unit(0.2, "cm")), color = "gray50") +
  # 添加变量名称标签
  geom_text(aes(label = terms), hjust = 0.5, vjust = -0.2, size = 4) +
  # 添加单位圆
  geom_circle(aes(x0 = 0, y0 = 0, r = 1), color = "black", linetype = "dashed", inherit.aes = FALSE) +
  # 坐标轴标签(带方差解释率)
  xlab(paste0("PC1 (", round(pca_variance$value[pca_variance$terms == "percent variance PC1"], 1), "%)")) +
  ylab(paste0("PC2 (", round(pca_variance$value[pca_variance$terms == "percent variance PC2"], 1), "%)")) +
  # 调整坐标范围与比例,保证圆为正圆
  xlim(-1.1, 1.1) +
  ylim(-1.1, 1.1) +
  coord_fixed() +
  theme_minimal()

4. 绘制样本散点图(复刻FactoMineR的fviz_pca_ind)

用提取的主成分得分绘制样本在主成分空间的分布:

ggplot(pca_scores, aes(x = PC1, y = PC2, color = Species)) +
  geom_point(size = 2) +
  xlab(paste0("PC1 (", round(pca_variance$value[pca_variance$terms == "percent variance PC1"], 1), "%)")) +
  ylab(paste0("PC2 (", round(pca_variance$value[pca_variance$terms == "percent variance PC2"], 1), "%)")) +
  theme_minimal()

关键说明

  • 主成分方向可能与FactoMineR结果相反:PCA对主成分的方向没有强制约束,只要变量间的相对关系一致,结果的解释性完全相同,无需额外处理。
  • 一致性验证:提取的载荷与FactoMineR的PCA结果$var$coord数值绝对值一致,仅符号可能差异,属于正常现象。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:08:09