R语言 循环移位 r语言循环画图_r语言 相关性作图


写在前面

大家好,你们的鸽王阿武来更新文章了,时隔n个月,我都有点不好意思了。这次给大家带来我在自己搬砖过程中遇到的一个问题和以及解决方法,当然了也是入门级的内容,大佬看到了可以无视。但是,如果有大佬愿意提一些建议的话那就再好不过了。

写这个代码的目的

众所周知,R语言可以用来统计分析和作图(我主要是因为R做出来的图比Excel好看所以用了R,我就是这么的肤浅)。好吧,其实这次用R主要原因是因为我搬砖过程中遇到了需要大批量作图还要进行差异显著性分析的问题,而这样大批量的作图和分析让我用Excel来搞我怕是会疯掉(当场去世)。好在是R语言中有两个包可以解决这些问题,分别是ggplot2和ggpubr。所以我本次循环作图主要用的也就是这两个包。请大家先行安装,安装命令相信接触过R语言的人都知道为:install.packages("packagename")因为两个包都有各自的依赖包,如果出现依赖包安装失败的情况请用这个命令先把依赖包装一遍后再来装这两个包。最后,写这个代码最重要的目的其实就是为了省时间,如果用一个图一个图画然后还要算是否差异显著,假如我需要画几百个图怕是要搞到猴年马月诶。那么接下来进入我们的正文。

代码思路

今天我们用一个现实点的例子,比如在做关联分析过程中后续总要对候选区间的SNP类型及其所对应的表型值画箱线图,来看这个SNP中不同基因型所对应的表型值是不是有差异。但是区间中往往有上百个SNP,这个时候就需要我们进行循环作图和显著性分析,并且在输出的图中表示出来是否差异显著。这样就可以躺在椅子上一边喝咖啡,一边悠闲的翻看输出图的右上角是不是有极显著的标识(是不是很自在)。所以具体思路就是把各个SNP中不同基因型和其对应的表型值分别存成一个txt文档,然后用R来循环读取每个文件来作图(思路其实很简单)。

需要准备的文件

SNP中不同基因型及其所对应表型值的txt文件

这次我用Excel随机生成的四组数据SNP01.txt~SNP04.txt都放在同一个文件夹下(毕竟我自己的实验数据肯定不能放上来),因为要画箱线图所以数据格式统一如下(节选):


R语言 循环移位 r语言循环画图_循环结构_02


根据自己txt文档的文件名生成的列表文档

生成方式其实很简单,如果你电脑装有Ubuntu的话,打开Ubuntu,然后cd到放这些txt文档的文件夹下,输入ls > list.txt命令即可。然后把表头改成SNP你就会得到如下的列表:


R语言 循环移位 r语言循环画图_r语言 相关性作图_03


为了方便后续操作可以通过Excel去掉后面的.txt后缀名得到如下列表:


R语言 循环移位 r语言循环画图_依赖包_04


有大佬说可以用list(pattern = "*txt")命令,大家可以尝试一下。如上,所需的文件已经准备完成。

脚本代码的编写

R包的加载

首先我们要载入ggplot2和ggpubr包代码并且设置工作目录如下:


library("ggplot2")
library("ggpubr")#载入R包
setwd("G:test")#设置工作目录


另外,因为画图过程中牵扯到修改字体等问题,为避免报错建议大家安装extrafont包,执行以下命令:


install.packages("extrafont")
font_import()
loadfonts()


循环结构的代码

我们在之前生成了一个所有文档名的列表文档,这个列表是循环的关键。通过以下代码载入该txt文档:


lt <- read.table("list.txt", header = T)#header=T表示第一行作为表头


其次是比较重要的循环结构代码的编写,需要用到的是R中的for循环,结构如下:


for (i in lt$SNP) {
title <- paste(i, ".txt", sep = "")
boxdata <- read.table(title, header = T)#读取文件名为i(变量)文件中的内容
}


这个循环结构的目的是读取lt中的每一个元素,读完停止。而这每一个元素是什么呢?就是我们每个数据文件所对应的文件名。另外,在循环中通过paste函数将.txt后缀名加上储存在title中,并且读取title所对应的文件存于boxdata中。

作图代码

作图代码就是ggplot2的代码,了解ggplot2的人肯定接下来都知道该如何写,具体代码如下:


p <- ggplot(boxdata, aes(x=boxdata$SNP, y=boxdata$phenotype, fill=boxdata$SNP)) + geom_boxplot(width=0.5) + coord_fixed(ratio=0.5) + labs(y="Phenotype", fill ="SNP", title=i) + theme(axis.title.x = element_blank(), plot.title = element_text(family="Times New Roman", hjust=0.5, vjust = 0.5, size = 14, face = "bold"), axis.title.y = element_text(family = "Times New Roman", size = 12, face = "bold"), axis.text = element_text(family="Times New Roman", size=12), legend.title = element_text(family="Times New Roman", face="bold", size=12), legend.text = element_text(family="Times New Roman", size=12), panel.background = element_blank(), panel.border = element_rect(colour = "black", fill = NA))


哇!代码好长啊!这是什么啊!我来说一下每个函数都是做什么的把,ggplot()是用来确定我们用哪些数据来作图,x对应的值是什么,y对应的值是什么,fill指的是填充色是什么,这里采用的其实是默认配色。geom_boxplot()表示的是我要画的是箱线图,箱子的宽度是0.5,coord_fixed()指的是坐标轴之间的缩放比例。labs()函数确定坐标轴的名称和图的标题。theme()确定图表主题包括文字的字体,大小等等,具体内容在这里theme。

差异显著性分析代码


stat_compare_means(method = "aov", label = "p.signif", label.x = 1.93, label.y = 10.3)


这里method值采用的分析方法这里采用方差分析,label = "p.signif"指的是不显示p值,但是显示星号来表示差异是否显著。label是用来确定这个星号在图中的哪个位置。这个包的更多用法见这里ggpubr

图形储存代码

储存采用比较间的ggsave代码,本次储存为两个格式一个是pdf一个是png。另外ggsave函数是可以通过width和height来调整储存图片的长和宽的,有需要的可以自行调整。


myfilename <- paste(i, ".pdf", sep = "")
ggsave(filename = myfilename)
myfilename <- paste(i, ".png", sep = "")
ggsave(filename = myfilename)


代码运行结果

综合上面每一块儿区域的代码合并后如下:


library("ggplot2")
library("ggpubr")
library("extrafont")
loadfonts()
setwd("G:softwareVnotetest")
lt <- read.table("list.txt", header = T)
for (i in lt$SNP) {
  title <- paste(i, ".txt", sep = "")
  boxdata <- read.table(title, header = T)
  p <- ggplot(boxdata, aes(x=boxdata$SNP, y=boxdata$phenotype, fill=boxdata$SNP)) + geom_boxplot(width=0.5) + coord_fixed(ratio=0.5) + labs(y="Phenotype", fill ="SNP", title=i) + theme(axis.title.x = element_blank(), plot.title = element_text(family="Times New Roman", hjust=0.5, vjust = 0.5, size = 14, face = "bold"), axis.title.y = element_text(family = "Times New Roman", size = 12, face = "bold"), axis.text = element_text(family="Times New Roman", size=12), legend.title = element_text(family="Times New Roman", face="bold", size=12), legend.text = element_text(family="Times New Roman", size=12), panel.background = element_blank(), panel.border = element_rect(colour = "black", fill = NA))
  p + stat_compare_means(method = "aov", label = "p.signif", label.x = 1.93, label.y = 10.3)
  myfilename <- paste(i, ".pdf", sep = "")
  ggsave(filename = myfilename)
  myfilename <- paste(i, ".png", sep = "")
  ggsave(filename = myfilename)
}


然后,进一步运行该R脚本即可得到如下八个文件:


R语言 循环移位 r语言循环画图_数据_05


然后你就可以躺在椅子上喝着咖啡筛选你的图片了。 作图效果如下:


R语言 循环移位 r语言循环画图_数据_06


右上角的ns表示无显著差异(生成的随机数肯定没显著性差异,要是有了我估计可以买彩票了)

总结

总的来说这个代码的复杂程度并不高,比较适合新手(因为我是个菜鸡)。另外,这个思路可适用于多种作图,不仅仅只限于箱线图。最后,需要注意以下几点:

  1. 要根据自己的数据来进行作图函数的调整,调整完美之后再进行循环作图,避免浪费时间。
  2. 要根据自己的数据类型选择适合的显著性分析方法。
  3. 一定要学会搜索,对于解决一些报错很重要。