了解和绘制火山图

师弟:师兄,火山图怎么得到的?我都快愁死了......
师兄:你不是学过R语言吗?
师弟:道理倒是都懂,看书归看书,但是实际应用起来大脑就一片空白,完全没有构思......
师兄:不怕,我这个有个完整的框架,你来学习一下?

首先,什么是火山图

火山图是转录组分析中经常能够见到的一类统计图,常用于反映差异表达基因概况。例如肿瘤组织与正常组织相比,那些基因存在过表达或被抑制,可以是编码基因、蛋白表达水平,也可以是其它lncRNA、miRNA、circRNA等非编码RNA分子。

火山图本质上是散点图的一种,因其外观形似火山(喷发),所以称为火山图。两个坐标轴中,一个代表差异倍数变化(通常为log2转化后的fold change值),一个代表显著性(通常为-log10转化后的p值或p调整值),将各基因映射到图中,并根据预先定义的阈值在图中用不同颜色标识显著上、下调的基因。


文献中常见火山图举例

差异表达基因分析

可知火山图主要反映的是基因整体差异表达状态。因此为了获得火山图,首先需要根据基因表达定量数据计算各基因在比较两组中的差异状况,获得表达值的倍数变化以及显著性信息,并定义阈值确定一些高度显著的差异基因。

常见方法如edgeR、DESeq2等,这些都是目前识别差异表达分子的主流工具。在前面的文章中也介绍过这些工具的使用,详情可点击查看:edgeR、DESeq2。

火山图绘制

具体的差异表达基因计算过程不是本篇的内容,就不再细提。

总之最后获得了类似这样的一张统计表,见示例数据“control_treat.count.txt”,记录了各基因的名称、log2转化后的fold change值、显著性p值、p调整值以及标识的显著上、下调基因等,接下来通过该表绘制火山图就可以了。

本文的所有测试数据和R代码,可在文末获取。

DESeq2的示例输出

就R的作图包而言,ggplot2为此提供了优秀的作图方案,参考以下示例。

初步绘制轮廓

首先,如上所述,火山图就是一种特殊的散点图样式。因此可以先不要管太多的细节,先大致绘制一个轮廓来观察下,数据是否合理,差异基因数量大致有多少等。

选择表中的log2转化后的fold change值(log2FoldChange),以及p调整值(padj)并进行-log10转化后,分别作为两个坐标轴,绘制散点图就可以了。

对于上、下调的基因,使用不同颜色表示。

#如未安装R包需要首先安装
#install.packages('ggplot2')

#加载R包
library(ggplot2)

#读取数据
dat <- read.table('control_treat.DESeq2.txt', header = TRUE, sep = '\t')

#ggplot2 作图,横坐标 log2FoldChange,纵坐标 -log10 转化后的 padj
p <- ggplot(data = dat, aes(x = log2FoldChange, y = -log10(padj))) +
geom_point(aes(color = sig), size = 1) +  #绘制散点图,点的颜色表示上下调状态
scale_color_manual(values = c('red', 'gray', 'green4'), limits = c('up', 'none', 'down')) + #指定节点颜色
labs(x = 'log2 Fold Change', y = '-log10 adjust p-value', 
    title = 'control vs treat', color = '')  #x、y 轴标题设置

p
初始样式,先绘制一个大致轮廓,用于观测整体数据

有关主题细节的调整

大致的轮廓出来后,如果觉得数据可观,适合摆放到文章中,就可以进一步的调整火山图的细节了。

接下来就需要设法将这个火山图变得更美观一些,涉及了ggplot2的主题调整。ggplot2的主题样式非常多,这里以一些简单示例来大致展示下。

例如,标题居中、去除网格线和背景、去除图例背景、字体大小修改以及在图中标出差异基因筛选的阈值线等。

#theme()用于修改主题,包括修改背景色、网格线、字体大小等
p <- p +
theme(plot.title = element_text(hjust = 0.5, size = 14), 
    panel.grid = element_blank(), panel.background = element_rect(color = 'black', fill = 'transparent'), 
    legend.key = element_rect(fill = 'transparent'), legend.text = element_text(size = 10), 
    axis.title = element_text(size = 12), axis.text = element_text(size = 10))

p

#xlim()和ylim()可设置坐标展示范围,使图左右对称
p <- p + xlim(-12, 12) + ylim(0, 35)

p
调整主题后的示例,比刚才美观许多
#例如先前根据 fold change ≥ 2 以及 padj < 0.01 筛选的显著差异基因
#也就对应了 |log2FoldChange| ≥ 1 以及 -log10(padj) > 2 的阈值
#geom_vline()和geom_hline(),在图中绘制垂线指示阈值线
p <- p +
geom_vline(xintercept = c(-1, 1), lty = 3, color = 'black') +
geom_hline(yintercept = 2, lty = 3, color = 'black')

p
添加差异基因筛选时的阈值线

特殊基因的标识

那么,如果有一些特别重要的基因,想在图中标识出它们的名称,应该怎样做呢?

继续来看这个示例,示例数据“top5_gene.txt”是选择的5个重要基因的名称,将根据这些名称在图中定位基因并将它们的名称显示出来。

本文的所有测试数据和R代码,可在文末获取。

#标识特定的基因,使用 ggplot2 的拓展包 ggrepel 来完成
library(ggrepel)

lab <- read.table('top5_gene.txt', header = TRUE, sep = '\t')
dat_select <- subset(dat, gene_id %in% lab$gene_id)  #根据重要的基因名称在原数据中提取它们的 log2FC 和 padj 值

p +  #并将这几个基因名称,根据坐标位置添加在原图中
geom_text_repel(data = dat_select, aes(x = log2FoldChange, y = -log10(padj), label = gene_id),
    size = 3, show.legend = FALSE)
在图中标识重要的基因名称,ggrepel包的好处是可以防止标签重叠



师兄:如何,get到了吗?
师弟:厉害厉害,从概念到分析再到作图,都一并包含了,点赞!


你可能感兴趣的:(了解和绘制火山图)