R统计绘图-PCA分析及绘制双坐标轴双序图

article/2025/7/9 1:05:46

zhe

点击名片   关注我们

83d49913ae1b3307828afec01e5f4c53.png

有师妹来咨询,怎样画类似于上图的双坐标轴PCA双序图。正好之前虽然PCA和RDA分析及绘图都写过教程,但是变量分析结果没有在图中显示,所以使用R统计绘图-环境因子相关性热图流程开始按图1整理环境因子数据,行为样品名称,列为环境因子名称和分组信息,共有11个环境变量,3个分组信息。

dc635b456b91282fd53879225247dc59.png

图1|环境因子及分组信息表,env.csv。行为样品名称,列为环境因子名称和分组信息,共有11个环境变量,3个分组信息。

一、 设置工作路径并调用R包

# 设置工作路径
#knitr::opts_knit$set(root.dir="D:\\EnvStat\\PCA")# 使用Rmarkdown进行程序运行
Sys.setlocale('LC_ALL','C') # Rmarkdown全局设置
setwd("D:\\EnvStat\\PCA")# 调用R包
library(vegan)
library(ggplot2)
library(scales)


二、数据准备

options(stringsAsFactors=F)# R中环境变量设置,防止字符型变量转换为因子
# 读入环境因子数据表
ENV=read.csv("env.csv",header = T,row.names = 1,sep = ",",comment.char = "",stringsAsFactors = F,colClasses = c(rep("character",4),rep("numeric",11)))
head(ENV) # 查看数据前几行
#dim(ENV) # 查看数据行、列数
#str(ENV) # 查看数据表每列的数据形式

三、PCA分析及绘图

3.1 PCA分析

使用vegan包进行PCA分析。

pca=rda(ENV[4:14],scale=T)
summary(pca)

50b04e1ec54dc346d574a222303b3c19.png

图2|PCA分析结果。

3.2 提取绘图数据

提取样本与环境变量的前两个PC轴的数据,用于绘制双序图。

# 3.2.1 提取前两轴样本特征值
s.pca=data.frame(pca$CA$u[,1:2],ENV[1:3]) # 样本得分与分类变量形成数据框
s.pca # 用点表示样本特征值
summary(s.pca) # 描述统计# 3.2.2 提取前两轴变量特征值
e.pca=data.frame(pca$CA$v[,1:2]) 
e.pca # 用箭头表示变量特征值
summary(e.pca) # 描述统计# 3.2.3 计算轴标签
PC1 =round(pca$CA$eig[1]/sum(pca$CA$eig)*100,2) #第一轴标签
PC2 =round(pca$CA$eig[2]/sum(pca$CA$eig)*100,2) #第二轴标签
PC1 # 一个数值
PC2

dc9c3df49e5a6761f2869e9ae0d14610.png

图3|样本前两轴特征值

01ca14eb7e13c2df7df07c6b6c9c3877.png

图4|环境变量前两轴特征值

3.3 绘制样本与变量双序图

3.3.1 单坐标轴PCA双序图

使用点表示样本特征值,箭头表示环境变量特征值。

# 3.3.1 样本和环境变量共用一个坐标轴
p1 = ggplot(data=s.pca,aes(PC1,PC2))+geom_point(aes(color=tillage,fill=tillage,shape=depth),size=3)+scale_color_manual(values=c("red","blue","green","grey"))+scale_shape_manual(values =c(15,16,17))+stat_ellipse(aes(group=tillage,color=tillage),level = 0.95,linetype=2)+labs(title="PCA plot",x=paste("PC1",PC1," %"),y=paste("PC2",PC2," %"))+theme_bw()+theme(axis.title = element_text(family = "serif", face = "bold", size = 18,colour = "black"))+theme(axis.text = element_text(family = "serif", face = "bold", size = 16,color="black"))+theme(panel.grid=element_blank())+geom_hline(yintercept=0)+geom_vline(xintercept=0)+geom_segment(data=e.pca,aes(x=0,y=0,xend=e.pca[,1],yend=e.pca[,2]),size=1,colour="blue",arrow=arrow(angle = 35,length=unit(0.3,"cm")))+geom_text(data=e.pca,aes(x=e.pca[,1],y=e.pca[,2],label=rownames(e.pca)),size=3.5,colour="black", hjust=(1-sign(e.pca[,1]))/2,angle=(180/pi)*atan(e.pca[,2]/e.pca[,1]))+theme(legend.position="top")
p1## 保存pdf格式图片到本地
ggsave("PCA1.pdf",plot = p1,device = "pdf",height = 6,width = 8)

072ce05316bb878a3caa11c2e49d1f85.png

图5|单坐标轴样本和环境变量PCA双序图

3.3.2 双坐标轴PCA双序图

使用点表示样本,箭头表示环境变量。因为两者PC轴的量级不一样,为了图的美观易读,下和左坐标轴表示样本的PC1和PC2,上和右坐标轴表示环境变量的PC1和PC2。

# 3.3.2 样本和环境变量使用不同的坐标轴
###  stat_ellipse()添加置信椭圆
p2 = ggplot(data=s.pca,aes(PC1,PC2))+geom_point(aes(color=tillage,fill=tillage,shape=depth),size=3)+scale_color_manual(values=c("red","blue","green","grey"))+scale_shape_manual(values =c(15,16,17))+stat_ellipse(aes(group=tillage,color=tillage),level = 0.95,linetype=2)+labs(title="PCA plot",x=paste("PC1",PC1," %"),y=paste("PC2",PC2," %"))+theme_bw()+theme(axis.title = element_text(family = "serif", face = "bold", size = 18,colour = "black"))+theme(axis.text = element_text(family = "serif", face = "bold", size = 16,color="black"))+theme(panel.grid=element_blank())+geom_hline(yintercept=0)+geom_vline(xintercept=0)
p2 # 首先绘制带95%置信椭圆的样本排序散点图## 使用sec_axis()设置第二坐标区间,坐标轴区间根据自身数据区间设置。
### scale_x/y_continuous(position="bottom/left")可用于设置第二坐标轴设置为下和上侧。
### breaks=round(seq(-0.8,1,0.2),1)用于设置刻度;
### labels=round(seq(-0.8,1,0.2),1)))设置刻度标签;
### theme()用于将第二坐标的轴线和刻度线设置为红色;
### coord_fixed(ratio =1.5/1) 设置X/Y坐标轴刻度长度相对比例。
p2 = p2 +geom_segment(data=e.pca,aes(x=0,y=0,xend=e.pca[,1],yend=e.pca[,2]),size=1,colour="black",arrow=arrow(angle = 35,length=unit(0.3,"cm")))+scale_x_continuous(expand=c(0,0),limits = c(-0.8,1),breaks=round(seq(-0.8,1,0.2),1),labels=round(seq(-0.8,1,0.2),1),sec.axis = sec_axis(~rescale(.,c(-0.8,1)),breaks=round(seq(-0.8,1,0.2),1),labels=round(seq(-0.8,1,0.2),1)))+scale_y_continuous(expand=c(0,0),limits = c(-0.4,0.6),breaks=round(seq(-0.4,0.6,0.1),1),labels=round(seq(-0.4,0.6,0.1),1),sec.axis = sec_axis(~rescale(.,c(-0.8,1.2)),                     breaks=round(seq(-0.8,1.2,0.2),1),labels=round(seq(-0.8,1.2,0.2),1)))+geom_text(data=e.pca,aes(x=e.pca[,1],y=e.pca[,2],label=rownames(e.pca)),size=3.5,colour="black",hjust=(1-sign(e.pca[,1]))/2,angle=(180/pi)*atan(e.pca[,2]/e.pca[,1]))+theme(legend.position="top",axis.line.x.top = element_line(colour="red"),axis.line.y.right = element_line(color = "red"),axis.ticks.x.top = element_line(color = "red"),axis.ticks.y.right = element_line(color = "red"))+coord_fixed(ratio =1.5/1)
p2 # 添加环境因子箭头,并添加次坐标轴## 保存pdf格式图片到本地
ggsave("PCA2.pdf",plot = p2,device = "pdf",height = 6,width = 8)

71f9b6f3ccadf5713396a6756d1515b9.png

图6|PCA样本排序图。

b0e3ab245be5dd99a24a3993b2a8953d.png图7|PCA双坐标轴双序图。需要注意的是,如果需要刻度线是对应的,比如0与0对应,则需要主坐标轴与次坐标轴的设置范围是等比例的,且必须设置expand=c(0,0)。如果只是绘制双Y轴图,可以设置全部从0起始,其他刻度可以不用对应上。

使用拼图的方法绘制双坐标轴图也是可以的,参考文献部分提供了另一种方法,所以这里就不写了。QQ交流群文件夹中下载,或后台发送“PCA双坐标轴双序图”,获取数据与代码文件。

参考文献

一文解决ggplot2坐标轴轴刻度线的设置问题

R语言ggplot2-调整坐标轴(一)

用R绘制双Y轴方法2

分享一个在ggplot2中绘制双坐标轴(Y轴)的方法


推荐阅读

R统计绘图-分子生态相关性网络分析

R语言实战|初阶1:基本图形

R语言实战|入门5:高级数据管理

R语言实战|入门4:基本数据管理

R语言实战|入门3:图形初阶

R语言实战|入门2:了解数据集

R语言实战|入门1:R语言介绍

R中进行单因素方差分析并绘图

R统计-多变量单因素参数、非参数检验及多重比较

R绘图-相关性分析及绘图

R绘图-相关性系数图

R统计绘图-环境因子相关性热图

R统计绘图-corrplot绘制热图及颜色、字体等细节修改

R统计绘图-corrplot热图绘制细节调整2(更改变量可视化顺序、非相关性热图绘制、添加矩形框等)

R绘图-RDA排序分析

R统计-VPA分析(RDA/CCA)

R统计-PCA/PCoA/db-RDA/NMDS/CA/CCA/DCA等排序分析教程

R数据可视化之美-节点链接图

R统计绘图-rgbif包下载GBIF数据及绘制分布图

R统计-正态性分布检验[Translation]

R统计-数据正态分布转换[Translation]

R统计-方差齐性检验[Translation]

R统计-Mauchly球形检验[Translation]

R统计绘图-单、双、三因素重复测量方差分析[Translation]

R统计绘图-混合方差分析[Translation]

R统计绘图-协方差分析[Translation]

R统计绘图-One-Way MANOVA


c4c4268c0bbabf42eb709c07b622ceb1.png

EcoEvoPhylo :主要分享微生物生态和phylogenomics的数据分析教程。

扫描左侧二维码,关注EcoEvoPhylo。让我们大家一起学习,互相交流,共同进步。

学术交流QQ群 | 438942456

学术交流微信群 |  jingmorensheng412

加好友时,请备注姓名-单位-研究方向。 


http://chatgpt.dhexx.cn/article/XhB3Fs2y.shtml

相关文章

PCA分析(主成分分析)--结果解读

主成分分析(PCA)是一个很好的工具,可以用来降低特征空间的维数。PCA的显著优点是它能产生不相关的特征,并能提高模型的性能。 PCA用于减少用于训练模型的特征维度数量,它通过从多个特征构造所谓的主成分(P…

R统计绘图-PCA分析绘图及结果解读(误差线,多边形,双Y轴图、球形检验、KMO和变量筛选等)

虽然PCA和RDA分析及绘图都写过教程,但是对于结果的解释都没有写的很详细,刚好最近有人询问怎样使用FactoMineR factoextra包进行PCA分析。所以使用R统计绘图-环境因子相关性热图中的不同土壤环境因子数据进行PCA绘图和结果解读推文。 一、 数据准备 # 1.1 设置工作路径 #kn…

使用 QTLtools 进行 PCA 分析

3 使用 QTLtools 进行 PCA 分析 QTLtools 工具可以进行基因型的PCA分析,也可以进行表型的PCA分析,以下教程分别针对基因型和表型的PCA进行介绍: 3.1 对基因型进行PCA分析; 命令如下所示: QTLtools pca --vcf genot…

R语言中如何进行PCA分析?利用ggplot和prcomp绘制基因表达量分析图

学习笔记的主要内容是在R语言中利用ggplot2进行PCA分析和绘图,包括简单分析与操作流程,对比不同方式得到的结果差异,提供脚本代码供练习. PCA分析的原理 在处理基因差异表达数据时,有时候需要分析其中因素的影响最大,…

r语言dataellipse_R语言 PCA分析

PCA数据分析 PCA结果分析及可视化首推factoextra包,能处理各种R函数计算PCA的结果,有: stats::prcomp() FactoMiner::PCA() ade4::dudi.pca() ExPosition::epPCA() 如果我们想判断PCA中需要多少个主成分比较好,那么可以从主成分的…

样本数据PCA分析

PCA分析及画图 library(ggpubr) library(ggplot2) library(ggthemes) data1<-read.table(./100klist.txt,header 1)[,1:4] head(data1)BCD_rep1 BCD_rep2 CK_rep1 CK_rep2 1 0.1987 0.2036 0.1807 0.2062 2 0.2133 0.2169 0.2040 0.2140 3 0.1943 0.1965 …

转录组-PCA分析

PCA分析步骤&#xff1a; 第一步&#xff0c;对所有样本进行中心化 第二步&#xff0c;求特征协方差矩阵 第三步&#xff0c;求协方差矩阵的特征值和特征向量 第四步&#xff0c;将特征值按照从大到小的顺序排序&#xff0c;选择其中最大的k个&#xff0c;然后将其对应的k个特征…

PCA分析及CNS级别作图

从这节开始&#xff0c;就逐渐涉及转录组的基本可视化了&#xff0c;我们的可视化要做到CNS级别的图&#xff0c;争取做好分析&#xff0c;一步到位&#xff0c;让您有真正的收获&#xff01; PCA&#xff08;主成分分析&#xff09;&#xff0c;具体的原理就不说了&#xff0…

R语言PCA分析

常用R包&#xff1a;princomp&#xff0c;prcomp及rda R中输入数据类型有两类&#xff0c;R mode和Q mode。一般来说数据每一列为一个变量&#xff08;variable&#xff09;&#xff0c;每一行为一个数据&#xff08;observation&#xff09;。其中R mode的数据行数大于列数&a…

CSS3 媒体查询

1. 什么是媒体查询 CSS3媒体查询&#xff08;Media Query&#xff09;语法的特性&#xff1a; ①使用 media 查询&#xff0c;可以针对不同的媒体类型定义不同的样式&#xff1b; ②media 可以针对不同的屏幕尺寸设置不同的样式&#xff1b; ③当你重置浏览器大小的过程中&am…

mysql以逗号分隔的字段作为查询条件怎么查——find_in_set()函数

文章目录 写在前面作为查询条件 多条件查询用于mybatis 聚合查询count总数查询distinct的列表find_in_set()函数走索引吗 写在前面 使用mysql时&#xff0c;有可能一个字段代表一个集合&#xff0c;如果将这个集合单独抽成一张表又不值当的&#xff0c;这个时候我们存储时&a…

PageHelper实现分页查询

文章目录 前言一、PageHelper实现分页查询二、PageHelper的基本使用1. 先编写持久层2.编写业务逻辑层3..编写控制层4.使用JsonPage返回结果 总结 前言 分页查询的优点 所谓分页,就是查询结果数据较多时,采用按页显示的方法,而不是一次性全部显示 分页的优点: 服务器:一次性…

降低数据库压力的方法

1.合理增加索引 表索引可以加快对表中数据的检索速度&#xff0c;但是会降低表中数据的更新速度&#xff0c;所以增加表的索引一定控制在合理范围内&#xff0c;过多的索引不但不会降低数据库的压力&#xff0c;反而可能增大数据库的压力&#xff0c;表索引的建立一般要从具体业…

MyBatis—利用MyBatis查询(查询所有,查询一行,条件查询)

文章目录 1、查询所有2、查询详情&#xff08;通过特定属性查询&#xff09;3、多条件查询&#xff08;1&#xff09;接口参数列表三种表达方式&#xff08;2&#xff09;多条件查询&#xff08;3&#xff09;动态Sql&#xff08;4&#xff09;多条件动态查询&#xff08;5&…

Redis实现分页和多条件模糊查询方案

导言 Redis是一个高效的内存数据库&#xff0c;它支持包括String、List、Set、SortedSet和Hash等数据类型的存储&#xff0c;在Redis中通常根据数据的key查询其value值&#xff0c;Redis没有模糊条件查询&#xff0c;在面对一些需要分页、排序以及条件查询的场景时(如评论&…

python操作es条件查询定制body

参考连接&#xff1a; python操作elasticsearch - 无量python - 博客园 1、切片查询 from elasticsearch import Elasticsearch# 建立连接 es Elasticsearch( hosts{192.168.0.120, 192.168.0.153}, # 地址timeout3600 # 超时时间 )# body指定查询条件 body {from: 0, #…

Oracle clob怎么存储超过4000长度的数据,你了解吗

目录 方式一、使用存储过程&#xff1a; 方式二、使用to_clob函数 方式三、mybatis中的方法 附&#xff1a; oracle将把varchar2字段&#xff08;长度4000&#xff09;改为clob类型 参考资料&#xff1a; 题记&#xff1a;我们知道Oracle存储的字段长度是有限制&#xff0…

oracle中clob和blob,Oracle中的BLOB和CLOB

非洲小白脸 阅读(364) 评论(0) 编辑 收藏 所属分类: oracle Oracle中的BLOB和CLOB 一、区别和定义 LONG: 可变长的字符串数据,最长2G,LONG具有VARCHAR2列的特性,可以存储长文本一个表中最多一个LONG列 LONG RAW: 可变长二进制数据,最长2G CLOB: 字符大对象Clob 用来存储单…

mysql clob blob_Oracle中 CLOB, BLOB和NLOB

SQL 类型 CLOB 在 Java TM 编程语言中的映射关系。SQL CLOB 是内置类型&#xff0c;它将 Character Large Object 存储为数据库表的某一行中的一个列。默认情况下&#xff0c;驱动程序使用 SQL locator(CLOB) 实现 Clob 对象&#xff0c;这意味着 CLOB 对象包含一个指向 SQL CL…

java clob 操作_Java Clob 操作

java操作数据库clob字段的简单例子&#xff1a; package com.test.db.clob; import java.io.BufferedReader; import java.io.IOException; import java.io.Writer; import java.sql.Clob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar…