了解和绘制火山图

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

首先,什么是火山图

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

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


文献中常见火山图举例

差异表达基因分析

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

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

火山图绘制

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

总之最后获得了类似这样的一张统计表,见示例数据“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到了吗?
师弟:厉害厉害,从概念到分析再到作图,都一并包含了,点赞!


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

推荐阅读更多精彩内容