R语言使用ggplot2绘制PCA主成分分析图详解

唐可
唐可
发布时间:2026-10-16| 3人浏览过
原创

主成分分析(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语言数据可视化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。