如何基于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
相关产品推荐
相关产品推荐

