本文使用 GOplot 包绘制弦图
首先要准备两个文件,一个是GO富集分析的结果,一个是基因差异表达分析的结果。一般我们都是用差异表达的基因进行GO富集分析,所以这两个文件还是很好准备的。(基因差异表达分析的结果是可选项,如果想要画的图更漂亮,更准确,就需要准确知道GO富集分析条目下每个基因的logFC)
准备第一个文件(GO富集分析的结果):
首先来看看GO富集分析的结果:
S gene number表示该条目下显著基因的个数,B gene number表示背景基因,enrichFactor表示S gene number比上B gene number。这里我按照S gene number降序排列,并选择Pvalue小于0.05的前5个条目 (条目的数量最好不要太多,条目下的基因最好也不要太多,不然最终成图后很难看)
GOplot对导入的GO富集分析的结果有一定的格式要求,要有五列,而且需要将列名命名为:
'category', 'ID', 'term', 'adjusted p-value' ('adj_pval') and 'genes'
并且,gene那一列中,每一行的gene需要用逗号隔开(不能是其他符号),可以直接用excel调整好这些格式要求,当然也可以用R语言:
>goenrichment <- read.csv(file = "clipboard",header = T,sep = "\t") #读入GO富集分析的结果
>goenrichment <- goenrichment[ , c(3,1,2,7,4)] #按照要求的顺序选择列
>colnames(goenrichment) <- c("category", "ID", "term", "adj_pval", "genes")
>goenrichment$genes <- gsub(";", ",", goenrichment$genes) # 用逗号替换分号
准备第二个文件(差异表达分析的结果):
值得注意的是,在gene_name那一列,可能会出现多个基因在一行的情况,比如:
上面这种情况,在取交集时,有多个基因的那行就识别不到,因此需要把它分开,变成一行只有一个基因的形式:
可以通过以下代码实现:
>logFC<- read.csv(file = "clipboard",header = T,sep = "\t") #读入差异表达分析的结果
>genedata <- data.frame()
>for(i in c(1:dim(logFC)[1])){
+ row_genelist <- strsplit(logFC[i,1],";",)[[1]]
+ num <- length(row_genelist)
+ if(num > 1){
+ genelogFC <- c(rep(logFC[i,2],num))
+ genedata <- rbind(genedata,cbind(gene = row_genelist,logFC = genelogFC))
+ }
+}
>colnames(logFC) <- colnames(genedata)
>logFC <- rbind(genedata,logFC)
除此以外,差异倍数的那一列还可能出现正无穷或者负无穷的情况,需要排除
GOplot对导入的差异表达分析的结果也有一定的格式要求,要有两列,而且需要将列名命名为:"ID", "logFC"
>colnames(logFC) <- c("ID","logFC")
准备好上面两个文件,就可以开始画图了:
要知道5个term下富集的基因的logFC,就要先知道这些条目下有哪些基因:
>genename <- NULL
>for (i in c(1:5)){
genelist <- c(goenrichment[i,4])
temp <- strsplit(list,",",)[[1]]
genename <- append(genename,temp,after = length(genename))
}
>genename <- genename[-which(duplicated(genename))] #删除重复的基因
>genename
>diffgene <- logFC[which(logFC$gene_name %in% gene),] # 取交集,获得每个基因的差异表达倍数,有些基因的差异表达倍数可能为无穷值,在开始阶段就被排除了,因此diffgene这个数据框里的基因数可能比genename里的基因少。
>head(diffgene) #行名称还是遵循logFC中的行名称
>diffgene$logFC <- as.numeric(diffgene$logFC) #保证第二列是数值类型
>circ <- circle_dat(goenrichment,diffgene) #创建画图所需要的矩阵
>head(circ)
# >chord <- chord_dat(circ,diffgene,goenrichment$term) #这一个函数会通过匹配circ和diffgene中的基因名,将diffgene中的差异表达倍数整合到circ矩阵中。但是这个函数如果直接用的话,只会传递匹配到的基因的logFC:
>chord #可以看出,整个chord矩阵就只有这些基因,即只有这些基因匹配到了。
这里有个小细节,矩阵circ中,genes那一列的基因全是大写,而我们准备的差异表达基因的数据框diffgene中,基因是有大写,有小写,因此不能匹配,不能把基因的差异表达倍数传递给circ这个矩阵,需要把diffgene中的基因名全部转为大写:
>diffgene$ID <- toupper(diffgene$ID)
>chord <- chord_dat(circ,diffgene,goenrichment$term) #此时就可以全部匹配,chord的行数就会和diffgene的行数一样
>GOChord(chord,space = 0.02,gene.order = "logFC",gene.space = 0.3,gene.size = 4,process.label = 3)
# 绘图;参数space表示图中圆形每部分的间隔,gene.order表示按照“logFC”排序,gene.space表示基因与圆形之间的间隔,process.label表示图例的大小。
最终效果如下图,可以看到基因数还是很多,所以效果不是很好。