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

R语言ggbiplot:如何依据载荷长度调整坐标轴刻度并生成指定图形?

嘿,我来帮你搞定这个PCA绘图的刻度问题!之前用ggbiplot的时候也琢磨过怎么切换旋转数据和载荷的坐标轴显示,下面分三种情况给你写好代码,直接就能用:

1. 仅显示旋转数据(ir_pca$x)刻度的PCA图

这其实是ggbiplot的默认表现,坐标轴刻度对应样本在主成分上的得分(也就是ir_pca$x的取值),代码如下:

# 先加载必备包和数据
library(ggplot2)
library(ggbiplot)
data(iris)

# 执行标准化后的PCA
ir_pca <- prcomp(iris[, 1:4], scale. = TRUE)

# 绘制仅显示旋转数据刻度的图
p1 <- ggbiplot(ir_pca, obs.scale = 1, var.scale = 1, 
               groups = iris$Species, ellipse = TRUE, 
               circle = TRUE) +
  ggtitle("PCA图:仅显示旋转数据刻度") +
  theme_minimal()
print(p1)

这里obs.scale=1保证样本得分的刻度正常显示,var.scale=1是变量载荷的缩放,不影响坐标轴的主刻度。

2. 包含载荷(ir_pca$rotation)刻度的PCA图

如果想要同时显示旋转数据和载荷的刻度,我们可以添加二次坐标轴,通过比例转换把载荷的尺度映射到图上:

# 提取PC1和PC2的载荷值
pc1_loadings <- ir_pca$rotation[, "PC1"]
pc2_loadings <- ir_pca$rotation[, "PC2"]

# 绘制带双刻度的图
p2 <- ggbiplot(ir_pca, obs.scale = 1, var.scale = 1, 
               groups = iris$Species, ellipse = TRUE, 
               circle = TRUE) +
  ggtitle("PCA图:同时显示旋转数据与载荷刻度") +
  # 顶部添加PC1载荷的二次坐标轴
  scale_x_continuous(sec.axis = sec_axis(
    ~ . / max(abs(ir_pca$x[,1])) * max(abs(pc1_loadings)),
    name = "PC1 载荷"
  )) +
  # 右侧添加PC2载荷的二次坐标轴
  scale_y_continuous(sec.axis = sec_axis(
    ~ . / max(abs(ir_pca$x[,2])) * max(abs(pc2_loadings)),
    name = "PC2 载荷"
  )) +
  theme_minimal()
print(p2)

原理是用旋转数据的最大值和载荷的最大值做比例转换,让载荷的刻度能匹配到图的范围,这样底部/左侧是样本得分刻度,顶部/右侧是载荷刻度。

3. 可选需求:仅显示载荷刻度的PCA图

如果只想保留载荷的刻度,隐藏旋转数据的刻度,可以把主坐标轴的刻度设为空:

p3 <- ggbiplot(ir_pca, obs.scale = 1, var.scale = 1, 
               groups = iris$Species, ellipse = TRUE, 
               circle = TRUE) +
  ggtitle("PCA图:仅显示载荷刻度") +
  scale_x_continuous(breaks = NULL, name = "",
                     sec.axis = sec_axis(
                       ~ . / max(abs(ir_pca$x[,1])) * max(abs(pc1_loadings)),
                       name = "PC1 载荷"
                     )) +
  scale_y_continuous(breaks = NULL, name = "",
                     sec.axis = sec_axis(
                       ~ . / max(abs(ir_pca$x[,2])) * max(abs(pc2_loadings)),
                       name = "PC2 载荷"
                     )) +
  theme_minimal()
print(p3)

这里通过breaks = NULL隐藏主坐标轴的刻度和名称,只保留二次坐标轴的载荷刻度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:15:24