R语言使用ggplot2绘制PCA主成分分析图详解
主成分分析(PCA)是数据降维的核心技术,其可视化结果能帮助直观判断样本分布与分簇情况。本文将展示如何利用R语言的ggplot2包绘制兼具学术严谨性与美观度的PCA图,重点解决散点着色与整体置信椭圆计算的冲突问题,并提供包括方差百分比轴标签及自定义配色在内的完整美化方案。
PCA图表原理与准备工作
主成分分析通过将高维数据映射到低维空间,保留最具区分性的特征。在可视化时,横纵坐标通常分别对应第一主成分(PC1)和第二主成分(PC2)。图表本质上是带有分类标识的散点图,常辅以置信椭圆以展示数据的聚集范围。
PCA形象解释说明:如同将三维水壶投射为二维图像,PCA旨在保留最大信息量的低维视图。
第1步:执行PCA计算并生成基础散点图
目的: 对数据进行标准化处理后进行PCA分解,并利用ggplot2绘制初始的点阵分布。
入口:R控制台或脚本环境。
动作: 加载数据,执行prcomp函数获取主成分得分(pca$x)及方差贡献率,随后构建图形基底。
library(ggplot2)
# 数据准备:选取非类别列用于PCA,单独提取Species作为分类依据
data = subset(iris, select = -Species)
class = iris[["Species"]]
# PCA计算:center=TRUE表示中心化,scale.=TRUE表示标准化
pca = prcomp(data, center = T, scale. = T)
pca.data = data.frame(pca$x)
# 计算各主成分的方差贡献率比例,用于后续标题标注
pca.variance = pca$sdev^2 / sum(pca$sdev^2)
# 绘制基础散点图,添加坐标轴线
ggplot(pca.data, aes(x = PC1, y = PC2)) +
geom_point(size = 3) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
theme_bw()
基础散点图展示:未着色前的PC1与PC2分布。
第2步:添加类别颜色与全局置信椭圆
目的: 根据样本类别区分散点颜色,并为所有样本计算一个统一的置信椭圆,避免每个类别独立计算导致图形杂乱。
入口: 修改ggplot的aes映射及stat_ellipse参数。
动作: 在aes中引入color = class实现着色;关键步骤在于stat_ellipse需设置inherit.aes = FALSE并显式指定坐标,以强制其忽略上层定义的类别颜色美学属性,从而对所有点计算单个椭圆。
library(ggplot2)
# 继承上一步的数据准备与PCA计算代码...
# 在aes中增加color = class实现分类着色
ggplot(pca.data, aes(x = PC1, y = PC2, color = class)) +
geom_point(size = 3) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
# inherit.aes = FALSE 是关键:防止stat_ellipse继承color映射,确保只画一个总椭圆
stat_ellipse(aes(x = PC1, y = PC2), linetype = 2, size = 0.5, level = 0.95, inherit.aes = FALSE) +
theme_bw()
类别着色效果:不同物种以不同颜色散点显示。
添加全局椭圆:正确使用inherit.aes后,单一透明椭圆覆盖所有数据点。
第3步:图表样式微调与细节优化
目的: 提升图表的专业度,包括自定义配色、移除干扰网格线、添加含方差百分比的轴标签及标题。
入口: ggplot2主题系统与标度控制。
动作: 使用scale_color_manual应用指定调色板;利用theme隐藏非必要的灰色网格;通过labs动态拼接文本,将前两步计算的pca.variance转换为百分比显示。
library(ggplot2)
# 继承上一步的代码...
# 定义自定义配色方案
palette = c("mediumseagreen", "darkorange", "royalblue")
ggplot(pca.data, aes(x = PC1, y = PC2, color = class)) +
geom_point(size = 3) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
stat_ellipse(aes(x = PC1, y = PC2), linetype = 2, size = 0.5, level = 0.95, inherit.aes = FALSE) +
theme_bw() +
# 应用自定义颜色
scale_color_manual(values = palette) +
# 清空除背景外的网格线,保持版面整洁
theme(panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank()) +
# 动态添加标题与带百分比信息的轴标签
labs(x = paste0("PC1: ", signif(pca.variance[1] * 100, 3), "%"),
y = paste0("PC2: ", signif(pca.variance[2] * 100, 3), "%"),
title = paste0("PCA of iris")) +
# 标题居中
theme(plot.title = element_text(hjust = 0.5))
最终效果图:带有清晰轴标签、自定义配色及简洁背景的PCA主成分分析图。
对比常见的商业软件(如SIMCA-P)输出,该R语言方案生成的图表不仅数据呈现一致,且凭借ggplot2的灵活控制能力,在可读性与审美上更具优势。以上就是R语言实现PCA主成分分析图的详细内容,更多关于R语言数据可视化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













