如何在R中提取ggbiplot PCA绘图所用的特征向量/变量载荷数据
方案1:直接从ggbiplot返回的ggplot对象提取绘图用原始数据
先把绘图代码赋值给一个对象,再提取对应层的数据源即可:
# 存储绘图对象 p <- ggbiplot(xD4PCA,obs.scale = .1, var.scale = 1, varname.size = 3, labels.size=6, circle = T, alpha = 0, center = T)+ scale_x_continuous(limits=c(-2,2)) + scale_y_continuous(limits=c(-2,2)) # 提取变量箭头对应的数据集,ggbiplot中变量数据默认在第二层的data中 var_data <- p$layers[[2]]$data # 也可以用ggplot_build提取渲染后的全量数据 build_data <- ggplot_build(p) var_render_data <- build_data$data[[2]]
提取出的var_data已经包含每个变量的PC1、PC2坐标值,你可以直接整理成需要的表格,还可以额外计算你提到的方向角度和向量大小:
library(dplyr) var_table <- var_data %>% mutate( # 计算向量长度(即你说的大小) magnitude = sqrt(x^2 + y^2), # 计算极坐标角度,转成0-360度格式,和你提到的272度参数匹配 angle = (atan2(y, x) * 180 / pi) %% 360 ) %>% select(变量名 = varname, PC1坐标 = x, PC2坐标 = y, 向量大小 = magnitude, 方向角度 = angle)
直接打印var_table就能看到所有变量的对应数据,搜索avg_sour就能得到和图上完全匹配的272度左右、大小为1的结果。
方案2:直接从PCA结果计算匹配参数的载荷数据
如果你不需要完全匹配绘图的渲染坐标,也可以直接从原始PCA对象提取,和你设置的ggbiplot参数对齐即可:
# 提取PCA旋转矩阵(载荷) pca_loadings <- as.data.frame(xD4PCA$rotation[,1:2]) # 匹配ggbiplot var.scale=1的缩放逻辑 pca_loadings <- pca_loadings * xD4PCA$sdev[1:2] ^ var.scale # 同样计算大小和角度 var_table <- pca_loadings %>% mutate( 变量名 = rownames(.), 向量大小 = sqrt(PC1^2 + PC2^2), 方向角度 = (atan2(PC2, PC1) * 180 / pi) %% 360 )
汇报展示优化建议
- 可以把表格按照向量大小降序排列,优先展示对主成分贡献更大的变量
- 可以在原图上只保留向量大小Top10的变量标签,隐藏剩余变量的标签,所有变量的完整数据放在旁边的表格中,观众既可以直观看到整体分布,也可以快速检索具体数值
内容的提问来源于stack exchange,提问作者DaveX
相关产品推荐
相关产品推荐

