使用ggbiplot/ggplot2调整PCA biplot中载荷标签的位置
解决方案:优化PCA Biplot(删除默认短箭头、自定义长箭头及标签)
1. 先解决载荷数量异常问题
出现10个载荷但实际只有8个参数,大概率是你做PCA时不小心包含了非参数列(比如分组列、ID列)。先检查并修正PCA输入数据:
# 假设你的原始数据框是df,仅筛选8个参数列做PCA params_df <- df[, c("参数1", "参数2", "参数3", "参数4", "参数5", "参数6", "参数7", "参数8")] # 重新执行PCA(记得标准化) pca <- prcomp(params_df, scale. = TRUE) # 验证载荷数量,应该为8行 dim(pca$rotation)
2. 绘制自定义Biplot(保留长箭头、移除默认短箭头、优化标签)
直接关闭ggbiplot的默认变量箭头,自行绘制加长箭头+防重叠的灰色背景标签:
library(ggbiplot) library(ggplot2) library(ggrepel) # 用于标签防重叠 # 构建加长后的载荷数据(缩放因子可根据图表大小调整,比如1.5) long_loadings <- as.data.frame(pca$rotation * 1.5) long_loadings$param <- rownames(long_loadings) # 绘制基础Biplot,关闭默认变量箭头和标签 p <- ggbiplot(pca, obs.scale = 1, var.scale = 1, var.axes = FALSE, # 关闭默认的短箭头 labels = NULL, # 不需要样本标签可设为NULL,按需调整 ellipse = FALSE) # 按需开启/关闭分组椭圆 # 添加自定义长箭头 p <- p + geom_segment(data = long_loadings, aes(x = 0, xend = PC1, y = 0, yend = PC2), arrow = arrow(length = unit(0.2, "cm")), color = "black") # 添加带灰色背景的标签,自动防重叠,直接定位到箭头末端 p <- p + geom_label_repel(data = long_loadings, aes(x = PC1, y = PC2, label = param), fill = "gray80", # 灰色背景 color = "black", box.padding = 0.3, point.padding = 0.5, segment.color = NA) # 去掉标签到点的连线,因为直接在箭头末端 # 优化图表主题和轴标签 p <- p + theme_minimal() + labs(x = paste0("PC1 (", round(pca$sdev[1]^2/sum(pca$sdev^2)*100, 1), "%)"), y = paste0("PC2 (", round(pca$sdev[2]^2/sum(pca$sdev^2)*100, 1), "%)")) print(p)
关键说明
var.axes = FALSE:彻底关闭ggbiplot自带的短箭头,避免和自定义长箭头重复geom_label_repel:自带灰色背景(通过fill参数设置),同时自动调整标签位置避免重叠,segment.color = NA移除多余的连接线段- 加长箭头的缩放因子(示例中的1.5)可根据图表的轴范围自行调整,确保箭头长度合适
内容的提问来源于stack exchange,提问作者Alice Hobbs
相关产品推荐
相关产品推荐

