【R画图学习8.1】PCA图

主成分分析,即Principle Component Analysis (PCA),是一种传统的统计学方法,被机器学习领域引入后,通常被认为是一种特殊的非监督学习算法,其可以对复杂或多变量的数据做预处理,以减少次要变量,便于进一步使用精简后的主要变量进行数学建模和统计学模型的训练,所以PCA又被称为主变量分析。

R语言中,实现这个方法的函数主要有 princomp , prcomp 等。查资料后,这两种方法的不同主要体现如下:

具体细节大家可以自行查资料学习。

# 使用R自带iris数据集(150*5,行为样本,列为特征) 可以自己对比一下2个函数结果的异同

############ prcomp函数 ################

# retx表示返回score,scale表示要标准化

iris.pca <- prcomp(iris[,-5],scale=T,rank=4,retx=T) #相关矩阵分解

summary(iris.pca) #方差解释度

iris.pca$sdev #特征值的开方

iris.pca$rotation #特征向量,回归系数

iris.pca$x #样本得分score

############ princomp函数 ################

library(stats)

# 默认方差矩阵(cor=F),改为cor=T则结果与prcomp相同

iris.pca<-princomp(iris[,-5],cor=T,scores=T)

# 各主成份的SVD值以及相对方差

summary(iris.pca)

# 特征向量,回归系数

iris.pca$loading

iris.pca$score

下面我们就用R这个自带的iris数据来画一下PCA图。

从这个数据来看,包含150行,5列,最后一列是按species分成了三类。

我们用prcomp函数来计算各个主成分,但是因为最后一列是Species,所以计算的时候需要先排除。

pca1 <- prcomp(iris[,-ncol(iris)],center = TRUE,scale= TRUE)

可以看出PC的信息存在x中。

df1 <- pca1$x # 提取PC score

df1 <- as.data.frame(df1) # 注意:如果不转成数据框形式后续绘图时会报错

可以通过summary函数查看每个主成分的贡献度。

summ1 <- summary(pca1)

summ1

所以我们可以summary里面的信息把PC1 PC2提取出来作为X和Y轴的lab。summ1$importance[2,1]和summ1$importance[2,2]是PC1和PC2。round函数是取小数点的位数。

xlab1 <- paste0("PC1(",round(summ1$importance[2,1]*100,2),"%)")

ylab1 <- paste0("PC2(",round(summ1$importance[2,2]*100,2),"%)")

df1$Species <- iris_input$Species

把原先的Specis类别信息加进来。

首先还是用ggplot2的来画,先画个基本版本的二维PCA图。

ggplot(data = df1,aes(x = PC1,y = PC2,color = Species))+

geom_point(size = 2.5)

下面我们添加上椭圆形的置信区间。

ggplot(data = df1,aes(x = PC1,y = PC2,color = Species))+

  geom_point(size = 2.5)+

  # 绘制置信椭圆:

  stat_ellipse(aes(fill = Species),type = "norm",geom = "polygon",alpha = 0.25,color = NA)

添加上x,y的lab和title。

ggplot(data = df1,aes(x = PC1,y = PC2,color = Species))+

  geom_point(size = 2.5)+

  # 绘制置信椭圆:

  stat_ellipse(aes(fill = Species),type = "norm",geom = "polygon",alpha = 0.25,color = NA)+

  labs(x = xlab1,y = ylab1,title = "PCA Scores Plot")

换个背景模式。

ggplot(data = df1,aes(x = PC1,y = PC2,color = Species))+

  geom_point(size = 2.5)+

  # 绘制置信椭圆:

  stat_ellipse(aes(fill = Species),type = "norm",geom = "polygon",alpha = 0.25,color = NA)+

  labs(x = xlab1,y = ylab1,title = "PCA Scores Plot")+

  theme_bw()

下面我们尝试修改色系。

ggplot(data = df1,aes(x = PC1,y = PC2,color = Species))+

  geom_point(size = 2.5)+

  # 绘制置信椭圆:

  stat_ellipse(aes(fill = Species),type = "norm",geom = "polygon",alpha = 0.25,color = NA)+

  labs(x = xlab1,y = ylab1,title = "PCA Scores Plot")+

  theme_bw()+

  scale_colour_manual(values = c("purple","orange","pink"))   #改变点的颜色

ggplot(data = df1,aes(x = PC1,y = PC2,color = Species))+

  geom_point(size = 2.5)+

  # 绘制置信椭圆:

  stat_ellipse(aes(fill = Species),type = "norm",geom = "polygon",alpha = 0.25,color = NA)+

  labs(x = xlab1,y = ylab1,title = "PCA Scores Plot")+

  theme_bw()+

  scale_colour_manual(values = c("purple","orange","pink"))+

  scale_fill_manual(values = c("purple","orange","pink"))   #可以改变填充色

下面我们试着调整文字等外观。

ggplot(data = df1,aes(x = PC1,y = PC2,color = Species))+

  geom_point(size = 2.5)+

  # 绘制置信椭圆:

  stat_ellipse(aes(fill = Species),type = "norm",geom = "polygon",alpha = 0.25,color = NA)+

  labs(x = xlab1,y = ylab1,title = "PCA Scores Plot")+

  theme_bw()+

  scale_colour_manual(values = c("purple","orange","pink"))+

  scale_fill_manual(values = c("purple","orange","pink"))+

  theme(plot.title = element_text(hjust = 0.5,size = 15), #修改title的位置

        axis.text = element_text(size = 11),axis.title = element_text(size = 13), #分别修改text和title文字的大小

        legend.text = element_text(size = 11),legend.title = element_text(size = 13),#分别修改legend文字的大小

        plot.margin = unit(c(0.4,0.4,0.4,0.4),'cm'))


下面,我们再测试另外一款经常用来画PCA的包ggbiplot,这个我经常在宏基因组领域看见,其实也是基于ggplot之上开发的包,只不过替用户省了很多事。

library(devtools)

install_github("vqv/ggbiplot")

library(ggbiplot)

另外还可以把ggplot上面的有些属性望上面叠加的。


ggbiplot(pca1, obs.scale = 1, var.scale = 1,

        #是否显示与变量的箭头

        var.axes=1,

        #改变箭头对应的变量的字体大小

        varname.size=4,

        # 分组信息:

        groups = iris$Species,

        # 是否显示置信椭圆:

        ellipse = T,

        # 是否显示中心的圆:

        circle = F,

        labels.size = 5) +

  theme_bw()+

  theme(legend.direction = 'horizontal', legend.position = 'top')+

  scale_color_discrete(name = 'Species') +

  theme(axis.text = element_text(size = 15),axis.title = element_text(size = 15),

        legend.text = element_text(size = 15),legend.title = element_text(size = 15))

其中箭头代表原始变量,方向代表原始变量和主成分的相关性,长度代表原始变量对于主成分的贡献度。


当然,还有很多其它的包也可以实现简便的PCA作图。

library(factoextra)

library(FactoMineR)

iris.pca <- PCA(iris[,-5], graph = T)

PC1,2...柱状图

fviz_screeplot(iris.pca, addlabels = TRUE, ylim = c(0, 80))


fviz_pca_biplot(iris.pca, label = "var",

                habillage=iris$Species,

                addEllipses=TRUE,

                ellipse.level=0.95,

                ggtheme = theme_minimal())

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容