R 数据可视化: PCA 主成分分析图

主成分分析(Principal Component Analysis,PCA)是一种无监督的数据降维方法,通过主成分分析可以尽可能保留下具备区分性的低维数据特征。主成分分析图能帮助我们直观地感受样本在降维后空间中的分簇和聚合情况,这在一定程度上亦能体现样本在原始空间中的分布情况,这对于只能感知三维空间的人类来说,不失为一种不错的选择。

再举个形象的栗子,假如你是一本养花工具宣传册的摄影师,你正在拍摄一个水壶。水壶是三维的,但是照片是二维的,为了更全面的把水壶展示给客户,你需要从不同角度拍几张图片。下图是你从四个方向拍的照片:

PCA形象解释说明

第一张图里水壶的背面可以看到,但是看不到前面。
第二张图是拍前面,可以看到壶嘴,这张图可以提供了第一张图缺失的信息,但是壶把看不到了。
第三张俯视图既可以看到壶嘴,也可以看到壶把,但是无法看出壶的高度。
第四张图是你打算放进目录的,水壶的高度,顶部,壶嘴和壶把都清晰可见。
PCA的设计理念与此类似,它可以将高维数据集映射到低维空间的同时,尽可能的保留更多变量。

开始作图

使用 R 语言能做出像 SIMCA-P 一样的 PCA 图吗?
答案是肯定的,使用 R 语言不仅能做出像 SIMCA-P 一样的 PCA 图,还能做出比 SIMCA-P 更好看的图,而且好看的上限仅取决于个人审美风格。

主成分分析图 = 散点图 + 置信椭圆,散点的横纵坐标对应 PCA 的第一主成分、第二主成分。

library(ggplot2)

数据准备
data = subset(iris, select = -Species)
class = iris[["Species"]]

PCA
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) +
    stat_ellipse(aes(x = PC1, y = PC2), linetype = 2, size = 0.5, level = 0.95) +
    theme_bw()

散点图+椭圆

接下来想给散点加上分类颜色:

library(ggplot2)

数据准备
data = subset(iris, select = -Species)
class = iris[["Species"]]

PCA
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, 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) +
    theme_bw()

给不同类别样本着色

颜色是加上了,但是椭圆咋变成了 3 个?

原来是 stat_ellipse 函数默认对每个类别的数据计算自己的置信区间。如何对多类样本只计算一个置信区间呢?查看 stat_ellipse 的帮助文档:

inherit.aes
default TRUE, If FALSE, overrides the default aesthetics, rather than combining with them. This is most useful for helper functions that define both data and aesthetics and shouldn’t inherit behaviour from the default plot specification,

原来是 stat_ellipse 函数默认会继承 ggplot 中的 aes 设置,如果希望 stat_ellipse 使用自己的 aes 设置,需要将参数 inherit.aes 设置为 FALSE。

library(ggplot2)

数据准备
data = subset(iris, select = -Species)
class = iris[["Species"]]

PCA
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, 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()

给不同类别样本着色

接下来对样式进行微调:为不同类别样本自定义着色,添加 x 轴、y 轴标题,添加 title:

library(ggplot2)

数据准备
data = subset(iris, select = -Species)
class = iris[["Species"]]

PCA
pca = prcomp(data, center = T, scale. = T)
pca.data = data.frame(pca$x)
pca.variance = pca$sdev^2 / sum(pca$sdev^2)

自定义颜色
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))

样式微调

将作图结果和 SIMCA-P 对比,散点、椭圆基本完全一致,只是比它更顺眼一些罢了~

欢迎留言讨论,如果本文有帮助到你,点个赞就更好啦!

[1] Master Machine Learning With scikit-learn

相关文章

Original: https://www.cnblogs.com/myownswordsman/p/r-ggplot-pca.html
Author: watermark’s
Title: R 数据可视化: PCA 主成分分析图

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/564952/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Flink Catalog

    Catalog 提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。 数据处理最关键的方面之一是管理元数据。 元数据可以是临时的,例如临时表、或…

    大数据 2023年6月3日
    060
  • Docker Oracle DataBase

    系统为 CentOS7,安装 Docker:https://www.cnblogs.com/jhxxb/p/11410816.html 一、下载构建脚本 wget https://…

    大数据 2023年5月29日
    062
  • 虚拟机连接mysql出现的问题

    1:下载mysql出现无法解析的问题 第一项为当前主机的ip 查看命令:ip addr 并且BOOTPROTO修改为static的前提下 就可以继续看下面的内容。 在端口号和网关配…

    大数据 2023年11月12日
    040
  • OC包装下的轻量SQL——FMDB

    什么是FMDB 官方介绍: This is an Objective-C wrapper around SQLite. FMDB是针对libsqlite3框架进行封装的三方数据库,…

    大数据 2023年11月11日
    044
  • (5)Flink CEP SQL四种匹配模式效果演示

    Flink CEP SQL中提供了四种匹配策略: (1)skip to next row 从成功匹配的事件序列中第一个事件的下一个事件开始下一个匹配 [En] Start the …

    大数据 2023年5月24日
    074
  • 网络化的控制系统简介(NCS)

    作为一个搞物联网应用的,最近才接触到NCS这个概念。有点东西,赶紧记录一下。 NCS由通过网络连通的控制环路组成,控制信号和反馈信号会在控制器和本地系统间交换。典型的方块图如下:其…

    大数据 2023年6月3日
    088
  • QT操作SQLITE数据库 插入中文字符乱码的问题

    在学习QT的过程中,在sqlite数据库中插入中文乱码的问题,用下面方法最简单有效,即 QString::fromLocal8Bit,就可以解决现实乱码的问题。 qt fromLo…

    大数据 2023年11月12日
    031
  • SQLite 中的日期和时间

    如果觉得文章有用,欢迎评论📝、点赞👍、推荐🎁 日期和时间类型 首先,SQLite 使用一种动态的数据类型系统, 数据的类型只和数据本身有关,与字段定义的类型无关。这一点和其他数据库…

    大数据 2023年11月10日
    030
  • 手写 promise

    class Promise { static resolve() {} static reject() {} static PENDING = "pending&quot…

    大数据 2023年5月26日
    053
  • WSL简单环境搭建以及踩坑

    笔者的电脑配置不高,开虚拟机跑linux总觉得太重。最近才了解到windows早就上了wsl2——一款较为轻量的虚拟机软件。所以笔者打算一边安装一边记录笔记,方便以后查阅,同时将内…

    大数据 2023年5月27日
    066
  • hadoop集群搭建+hive安装

    1.系统环境 VMware-workstation:VMware-workstation-full-16.2.3 ubuntu:ubuntu-21.10 hadoop:hadoop…

    大数据 2023年11月12日
    044
  • Linux基础命令四

    如何获取命令帮助 内部命令 [root@lnh ~]# help pwd pwd: pwd [-LP] Print the name of the current working …

    大数据 2023年5月27日
    076
  • NoSQL调查Part1:NoSQL可能无法兑现承诺的五种情况

    很多最终成为Volt Active Data客户的公司都是从用NoSQL数据库取代传统的RDBMS平台开始的。鉴于传统的数据库技术性能差,缺乏云计算的友好性,以及高昂的成本,放弃它…

    大数据 2023年6月3日
    071
  • Apache Ranger Hadoop 集群权限框架_了解Ranger—Ranger工作笔记001

    1.Apache ranger 是一个 Hadoop 集群权限框架,提供操作、监控、管理复杂的数据权限,它提供一个集中的管理机制,管理基于 yarn 的 Hadoop 生态圈的所有…

    大数据 2023年5月24日
    072
  • docker安装lamp环境

    简单理解docker:docker 是一个开源的应用容器引擎,就像虚拟机,可以在它上面跑应用服务(container),而生成应用服务的就叫镜像(image)。 1、首先得安装do…

    大数据 2023年5月29日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球