You need to enable JavaScript to run this app. 如何基于R的prcomp输出绘制SVD/PCA的距离与相关性双标图
优惠活动
大模型
产品
解决方案
定价
更多

如何基于R的prcomp输出绘制SVD/PCA的距离与相关性双标图

基于R prcomp输出生成两类PCA双标图的实操方法

所有双标图转换均基于prcomp返回的三个核心可复用字段,无需额外复杂计算:

  • x:主成分得分矩阵,行对应单个样本,列对应各主成分
  • rotation:变量载荷矩阵,列对应各主成分,行对应原始变量的权重
  • sdev:各主成分的标准差,由对应主成分的特征值开平方得到

相关性双标图(correlation biplot)

核心定位

这类双标图的设计目标是直观展示变量间的相关关系、样本与变量的取值关联:图内两个变量箭头的夹角余弦值,近似等于两个原始变量的皮尔逊相关系数。

坐标转换规则(直接对应prcomp输出)

  • 样本点坐标:取x矩阵的前2个主成分列,逐列除以对应主成分的sdev值,消除主成分方差差异带来的过度拉伸
  • 变量箭头坐标:取rotation矩阵的前2个主成分列,逐列乘以对应主成分的sdev值,让箭头长度匹配变量在主成分上的实际载荷

可直接运行的示例代码

# 基于内置iris数据集跑标准化PCA
pca_res <- prcomp(iris[, 1:4], scale. = TRUE)

# 计算双标图坐标
sample_pos <- sweep(
  x = pca_res$x[, 1:2],
  MARGIN = 2,
  STATS = pca_res$sdev[1:2],
  FUN = "/"
)
var_arrow_end <- sweep(
  x = pca_res$rotation[, 1:2],
  MARGIN = 2,
  STATS = pca_res$sdev[1:2],
  FUN = "*"
)

# 绘制基础样本点
plot(
  sample_pos,
  pch = 16,
  col = as.factor(iris$Species),
  xlab = paste0("PC1 解释方差: ", round(pca_res$sdev[1]^2 / sum(pca_res$sdev^2) * 100, 1), "%"),
  ylab = paste0("PC2 解释方差: ", round(pca_res$sdev[2]^2 / sum(pca_res$sdev^2) * 100, 1), "%"),
  main = "相关性双标图"
)
# 叠加变量箭头与标注
arrows(0, 0, var_arrow_end[,1], var_arrow_end[,2], col = "red", lwd = 2)
text(var_arrow_end * 1.1, labels = rownames(var_arrow_end), col = "red")

解读规则

  • 两个变量箭头夹角小于90°为正相关,大于90°为负相关,接近90°为弱相关
  • 某样本沿着变量箭头方向的投影长度越长,代表该样本在对应原始变量上的取值越高

距离双标图(distance biplot)

核心定位

这类双标图的设计目标是真实还原样本间的欧氏距离:图内样本点的直线距离,和原始标准化变量空间中样本的欧氏距离近似相等。

坐标转换规则(直接对应prcomp输出)

  • 样本点坐标:直接取x矩阵的前2个主成分列,不需要额外缩放,天然保留样本间的距离结构
  • 变量箭头坐标:直接取rotation矩阵的前2个主成分列作为箭头端点,不需要乘以sdev值,保证箭头方向和原始变量的投影轴完全对齐

可直接运行的示例代码

# 承接上面的pca_res对象
# 计算双标图坐标
sample_dist_pos <- pca_res$x[, 1:2]
var_dist_arrow_end <- pca_res$rotation[, 1:2]

# 绘制基础样本点
plot(
  sample_dist_pos,
  pch = 16,
  col = as.factor(iris$Species),
  xlab = paste0("PC1 解释方差: ", round(pca_res$sdev[1]^2 / sum(pca_res$sdev^2) * 100, 1), "%"),
  ylab = paste0("PC2 解释方差: ", round(pca_res$sdev[2]^2 / sum(pca_res$sdev^2) * 100, 1), "%"),
  main = "距离双标图"
)
# 叠加变量箭头与标注
arrows(0, 0, var_dist_arrow_end[,1], var_dist_arrow_end[,2], col = "blue", lwd = 2)
text(var_dist_arrow_end * 1.1, labels = rownames(var_dist_arrow_end), col = "blue")

解读规则

  • 两个样本点的直线距离越近,代表两个样本在原始变量空间的特征相似度越高、欧氏距离越小
  • 变量箭头的指向为对应原始变量的数值升高方向,样本越靠近箭头指向的外侧,代表在对应变量上的取值越高

常见踩坑提醒

  • 两类双标图的缩放系数不可混用:缩放方向反了会同时导致样本距离失真、变量夹角的相关关系解读错误
  • 如果调用prcomp时没有设置scale. = TRUE,需要提前对原始变量做z-score标准化再运行PCA,避免量纲差异导致的结果偏差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.07 02:36:04