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
相关产品推荐
相关产品推荐

