火山图生成器
火山图生成器,用于论文和学位论文中的 RNA-seq、蛋白质组学和代谢组学结果:按你设定的阈值分出上调和下调基因,标出最显著的基因,在图例里给出计数,全部按你的表格计算。
火山图生成器的期刊风格
火山图生成器的五种期刊样式,各配一份不同的示意结果表:敲除小鼠肝脏、单细胞标记基因、植物干旱胁迫、吸烟者芯片数据和一次磷酸化蛋白质组学筛选。点击卡片即可载入它的提示词和基因。
火山图示例
四个来自火山图生成器的火山图示例(RNA-seq、蛋白质组学、代谢组学和一组带标注的基因),都是按卡片上的提示词和表格实际生成的。点击卡片即可把它的提示词和基因载入输入框。
什么是火山图?
火山图用一张图展示差异表达分析的结果:每个基因是一个点,x 轴是它在两种条件之间的 log₂ fold change(差异倍数的以 2 为底的对数),y 轴是它的 p 值的 −log₁₀。 变化大且可靠的基因升到左右两个上角,没有变化的基因在零附近形成低而宽的底座,这个形状就是火山图名字的由来。差异倍数和显著性的虚线阈值把各点分成上调、下调和不显著三类。
关于这个火山图工具
- 火山图生成器用程序按你的表格计算 −log₁₀ p、每个基因的类别、计数、两条坐标轴和阈值线,再把每个坐标交给图像模型。模型只负责摆放。
- 火山图生成器的默认阈值是 |log₂ fold change| ≥ 1(即 2 倍变化)和 p < 0.05,你的数值是 padj、FDR 或 q 值时按校正后的 p 理解。可以在提示词里修改:“|log2FC| > 0.58 and padj < 0.01”。
- 原始差异倍数会被换算:请求里写的是 fold change 而没有提 log 时(乳酸 3.2),火山图生成器画出 log₂ 3.2 = 1.68。文件则按列标题判断。
- 200 个基因以内,火山图生成器精确列出每一个点。超过这个数时,最显著的基因精确定位,灰色底座按真实的数量和形状绘制,所以一份 20,000 个基因的表格仍保留真实计数。
火山图怎么看:逐点解读
一组 RNA-seq 比较(干扰素-β 对比模拟处理)中的二十个示意基因,用火山图生成器运行的同一套代码绘制,阈值为 |log₂FC| ≥ 1 和 padj < 0.05。图上的编号与下面的步骤对应。
- 1
横向:变化的方向和大小
x 是干扰素-β 相对模拟处理的 log₂ fold change。0 表示无变化,+1 表示变为两倍,−1 表示减为一半,IFIT1 在 +5.1,约高 34 倍。刻度是对称的,减半在左边的距离和加倍在右边的距离相同。
- 2
纵向:证据强度,不是变化大小
y 是校正后 p 的 −log₁₀。1.3 处的虚线是 padj 0.05,2 是 0.01,IFIT1 在 13.7,即 padj 2 × 10⁻¹⁴。越高说明这个变化越不可能是噪声;它不说明变化有多大。
- 3
两个上角是显著基因
x = 1 右侧、虚线上方是六个上调基因(IFIT1、ISG15、MX1、RSAD2、OAS1、IRF7);−1 左侧是四个下调基因(COL1A1、TGFBI、MYC、CCND1)。论文报告的就是这些计数。
- 4
中间偏高:显著但变化小
STAT1 位于 (0.7, 8.5):它的变化测得非常精确,但只有 1.6 倍,低于 2 倍线,所以仍是灰色。FN1 在下调一侧、位置更低处也是这样。
- 5
远离中心但位置低:变化大但不确定
CXCL10 位于 (3.9, 0.9):平均高出 15 倍,但 padj 为 0.12。读数少或重复之间不一致,就会得到这样的点。在这组阈值下它不算显著,但值得再看一眼。
- 6
灰色底座:没有变化的基因
ACTB、GAPDH 等管家基因挤在 (0, 0) 附近。在全基因组 RNA-seq 火山图中,这个底座容纳了检测的 15,000 到 25,000 个基因中的大多数。
把这 20 个基因交给火山图生成器,然后在提示词里改一个阈值,看看哪些点越过了阈值线。
如何使用火山图生成器
把基因数据交给火山图生成器
每行一个基因,按 名称、log₂ fold change、p 输入(FKBP5 3.1, 1.2e-12;CCL2 −2.2, 5e-7),或者以 .csv、.tsv 或 .xlsx 附加结果表。能识别 DESeq2、edgeR、limma、Seurat 和 Perseus 的列标题,最多 60,000 行。
写明比较组和阈值
写 Treated vs Control 作为轴标题;阈值不是 |log₂FC| ≥ 1 和 p < 0.05 时也写明(校正后的值写 padj 或 FDR)。写出要标注的基因名,或者要求标出前 N 个;默认标出最显著的十个基因,两侧各占一部分。
选择期刊风格并生成
可选 Nature、Cell Press、PLOS、Bioinformatics 或类似 ggplot2 的预印本样式。火山图生成器在图像模型绘图之前算好坐标、类别、计数和阈值线,之后每次追加修改都会重新计算。
DESeq2、edgeR、limma 和 Seurat 的哪些列用于火山图
每种分析流程都输出同样的三个数,只是列名不同。下面是火山图生成器从各类结果表中读取的列,所以文件可以按导出时的原样附加。
| 结果表 | x:log₂ fold change | y:p 值 | 校正后 p(优先使用) | 注意事项 |
|---|---|---|---|---|
| DESeq2 results() | log2FoldChange | pvalue | padj | 被独立过滤去掉的基因 padj 为 NA;这些行会被跳过。DESeq2 作者建议作图和排序时使用 lfcShrink() 收缩后的差异倍数。 |
| edgeR topTags() | logFC | PValue | FDR | FDR 默认为 Benjamini–Hochberg 校正。logCPM 是平均表达量,不是差异倍数。 |
| limma topTable() | logFC | P.Value | adj.P.Val | B 是差异表达的对数优势比,不是 p 值;不要把它放到 y 轴上。 |
| Seurat FindMarkers() | avg_log2FC | p_val | p_val_adj | p_val_adj 是对全部基因做的 Bonferroni 校正,经常正好为 0;这些基因按最小的非零值绘制。Seurat v3 输出的 avg_logFC 是自然对数。 |
| Perseus (MaxQuant) | Difference | −Log p-value(已经是 −log₁₀) | q-value | −log₁₀ 列会先换算回 p,避免重复取对数。 |
| 你自己的表格 | log2FC | p 或 pvalue | padj、FDR 或 q | 列标题为 Fold change 且不带 log 时,会换算成 log₂:4 变为 2,0.25 变为 −2。 |
文件同时有原始 p 列和校正后 p 列时,火山图生成器用校正后的那一列作图和判断阈值,DESeq2、edgeR 和 limma 的结果通常也是这样报告的。如果要画原始 p,请删掉校正后那一列再附加表格。
火山图阈值:|log₂FC| 和 padj 改变了什么
两个阈值决定哪些点算显著基因,它们是人为选择,不是数据本身的事实。|log₂ fold change| ≥ 1 要求至少加倍或减半;padj < 0.05 意味着接受在判定的基因中约有 5 % 是假发现。下面是解读示例中的同样 20 个基因,在四组阈值下由火山图生成器自己的代码计数的结果:
| 阈值 | 上调 | 下调 | 不显著 | 变化情况 |
|---|---|---|---|---|
| |log₂FC| ≥ 1,padj < 0.05(常用默认值) | 6 | 4 | 10 | STAT1 和 FN1 过了 p 值关但没过倍数关,CXCL10 过了倍数关但没过 p 值关,所以三个都还是灰色。 |
| |log₂FC| ≥ 0.58(1.5 倍),padj < 0.05 | 7 | 5 | 8 | 1.5 倍的阈值让 STAT1 和 FN1 进入显著区:这是测得非常精确的小变化。 |
| |log₂FC| ≥ 1,padj < 0.01 | 6 | 3 | 11 | 更严格的 p 去掉了 CCND1(padj 0.019)。上调基因的 padj 本来就都低于 0.001,所以那一侧不变。 |
| |log₂FC| ≥ 2(4 倍),padj < 0.001 | 5 | 1 | 14 | 只剩下最强的干扰素应答基因,IRF7 被排除,下调一侧只剩 TGFBI 一个基因。 |
有两个容易犯的错误。一是用 padj 判断阈值,y 轴却画原始 p,水平线就会落在没有用作阈值的位置,灰色点可能出现在线的上方。二是从 R 脚本里抄来的阈值 10e-6,在 R 里是 10 × 10⁻⁶ = 1e-5,而不是 1e-6。告诉火山图生成器你画的是哪种 p,阈值线就会正好落在那个值上。
火山图生成器能画什么:RNA-seq、蛋白质组学、单细胞等
论文和学位论文中常见的七种火山图,各自的特点,以及要让火山图生成器画出它该怎么写。
RNA-seq 火山图(DESeq2、edgeR、limma-voom)
最常见的火山图:检测的 15,000 到 25,000 个基因每个一个点,y 轴为校正后 p(padj 或 FDR)。 DESeq2 的 lfcShrink() 收缩后的差异倍数能防止低计数基因飞到 ±8。按导出时的原样附加结果文件;超过 200 个基因时,火山图生成器精确定位显著基因,并按计数绘制灰色底座。
蛋白质组学火山图
蛋白强度的 log₂ 比值(非标记定量 LFQ 或 TMT)对 t 检验或 limma 的 −log₁₀ p,通常有 2,000 到 6,000 个蛋白。 用基因名而不是 UniProt 登录号做标签。Perseus 常画一条弯曲的显著性曲线(FDR 配合 s0 常数);火山图生成器画的是直线阈值,所以请写明你用的 |log₂FC| 和 p。
代谢组学和脂质组学火山图
差异倍数常以原始比值报告(肿瘤/正常 = 3.2),配合 t 检验或 Wilcoxon 检验的 p 和 FDR。 写 fold change 而不写 log,火山图生成器就会换算数值:3.2 画在 1.68,0.5 画在 −1。特征数一般是几百个,所以每个点都精确列出。
单细胞标记基因火山图(Seurat FindMarkers)
一个细胞簇对比其余所有细胞,x 为 avg_log2FC,y 为 p_val_adj。 每次检验有成千上万个细胞,p 值可低至 10⁻⁸⁰ 以下,所以 y 轴比 bulk RNA-seq 高得多;很多基因的 p_val_adj = 0,火山图生成器把它们画在表中存储的最小值处。
芯片火山图(limma)
limma 由 log₂ 强度算出的 logFC 和 adj.P.Val,常常针对探针组而不是基因。 与 RNA-seq 相比差异倍数被压缩,所以常用 1.5 倍阈值(|log₂FC| ≥ 0.58)。火山图生成器取 Symbol 列作标签,Symbol 为空时用探针 ID。
突出显示指定基因的带标注火山图
标注一组选定基因(比如论文研究的那条通路)而不是最显著基因的火山图。 写“只突出显示 NANOG、SOX2 和 MYC”,火山图生成器就只标这几个,即使它们是灰色的;这往往正是这张图要说明的问题。
磷酸化蛋白质组学和 CRISPR 筛选火山图
同样的坐标轴,换成别的单位:磷酸化蛋白质组学中的磷酸化位点(EGFR_Y1068),或 MAGeCK 筛选中按 sgRNA 计数算出 log₂ fold change 的基因。 标签可以是位点名;告诉火山图生成器一个点代表什么,轴标题就会写明。
火山图与 MA 图的区别
火山图把差异倍数对显著性作图;MA 图把差异倍数对平均表达量作图。 两者来自同一张结果表。火山图回答哪些基因发生了可靠的变化;MA 图回答差异倍数是否取决于基因的表达强度。
火山图
MA 图
| 对比项 | 火山图 | MA 图 |
|---|---|---|
| x 轴 | log₂ fold change | 对数尺度的平均表达量(A:DESeq2 的 baseMean、edgeR 的 logCPM、limma 的 AveExpr) |
| y 轴 | −log₁₀ p 或校正后 p | log₂ fold change(M) |
| 形状 | 从 x = 0 处宽底座升起的 V 形 | M = 0 附近一条平坦的带,在低表达处呈扇形散开 |
| 回答的问题 | 哪些基因变化大且可靠 | 低计数基因是否夸大了差异倍数,标准化是否让 M 以 0 为中心 |
| 用在哪里 | 结果图,标出显著基因 | 质量控制和补充材料图 |
火山图生成器画的是火山图。要在所有样本中展示同一批显著基因,请用热图生成器画它们的标准化表达量。
火山图生成器与 R、Prism、Python 和 Excel 的对比
大多数火山图是用 R 根据 DESeq2 或 limma 表格画的,或者在 GraphPad Prism 做完多重 t 检验后画的,也有用 Python 画的。各自的工作量落在哪里:
| 对比项 | 火山图生成器 | R (ggplot2, EnhancedVolcano) | GraphPad Prism | Python (matplotlib) | Excel |
|---|---|---|---|---|---|
| 起点 | 手动输入的行,或按原样导出的 DESeq2、edgeR、limma 或 Seurat 表格 | 一个结果数据框和一段脚本 | 一次多重 t 检验分析,或一张差异倍数与 −log₁₀ p 的 XY 表 | 一个 pandas DataFrame 和一段脚本 | 差异倍数列和 p 值列,再加一列辅助列 =-LOG10(C2) |
| −log₁₀ p | 按表格计算 | 在 aes() 里写 -log10(padj);EnhancedVolcano 替你完成 | 由 t 检验分析计算 | -np.log10(df.padj) | 自己写公式 |
| 阈值线和颜色 | 按你写明的阈值(默认 1 和 0.05),并统计各类数量 | geom_vline、geom_hline 加一个类别列;EnhancedVolcano 用 pCutoff 和 FCcutoff | 在分析中设置,或作为额外数据系列画出 | axvline、axhline 加一个颜色列 | 每条线单独一个系列;每种颜色一个系列 |
| 基因标签 | 按显著性取前 10 个、前 N 个,或你指定的基因 | ggrepel,或 EnhancedVolcano 的 selectLab | 一个点一个点地标 | annotate 或 adjustText | 数据标签,逐个添加 |
| 期刊样式 | 五种期刊预设 | 手写主题 | Prism 图表模板 | 手写 rcParams | 手动排版 |
| 你需要准备什么 | 一个浏览器 | R 和 Bioconductor | Prism 许可证 | Python 和 matplotlib | Excel |
已经有一张自己喜欢的 ggplot2 火山图?把截图作为参考图和表格一起附加,火山图生成器会保留你的数字,同时照着那种外观来画。
火山图生成器常见问题
火山图展示的是什么?
一次性展示两种条件之间哪些基因发生了变化、变化多大、有多可靠。 每个点是一个基因:左右位置是 log₂ fold change,高度是 −log₁₀ p 值。点越高、越靠外,变化就越大、越确定;零附近的灰色底座是没有变化的基因。
火山图怎么看?
先横着看变化的大小和方向(右为上调,左为下调,±1 表示加倍或减半),再竖着看证据强度(1.3 对应 p = 0.05,往上每高一个单位,p 就小十倍)。显著基因位于虚线之外的两个上角。上面的逐点解读用一个 20 个基因的例子读遍了全部六个区域。
火山图应该用多大的 log₂ fold change 阈值?
最常用的是 |log₂FC| ≥ 1,即 2 倍变化;预期效应较小时(如蛋白质组学、芯片或单细胞数据)用 0.58(1.5 倍)。 阈值是报告时的选择,所以要在图注中写明。在火山图生成器里,把它写进提示词(“|log2FC| > 0.58”),或写成 N 倍变化(“1.5-fold”),会被换算成 log₂。
y 轴应该画 p 值还是校正后 p 值?
显著性阈值用的是哪一种就画哪一种,这样水平线的含义才和图注一致。检验了成千上万个基因时,大多数论文用 Benjamini–Hochberg 校正后的 p(padj、FDR、q)判断阈值并作图。数值为校正后 p 时,火山图生成器把轴标题写成 −log₁₀(校正后 p 值),否则写成 −log₁₀(p 值)。
我的火山图为什么一边倒?
因为上调的基因比下调的多,或者相反:火山图的对称程度取决于生物学本身。整个灰色底座偏离 x = 0 则是另一回事。这通常提示标准化有问题,在解读显著基因之前值得先用 MA 图检查一下。火山图生成器绝不会为了看起来平衡而把点云镜像翻转。
为什么火山图顶部有一排点堆成一条平线?
这些基因的 p 值太小,无法存储,被写成了 0,于是 −log₁₀ p 为无穷大,作图软件把它们截到同一高度。这在 Seurat 的 p_val_adj 和测序深度很高的 RNA-seq 中很常见。火山图生成器把这些基因画在表中最小的非零 p 处,并在图上注明;报告为 p < 10⁻³⁰⁰ 是诚实的,编一个精确值则不是。
怎样用 R 画火山图?
用 ggplot2 时,先加一个类别列(上调、下调、不显著),然后 ggplot(res, aes(log2FoldChange, -log10(padj), colour = class)) + geom_point() + geom_vline(xintercept = c(-1, 1), linetype = 2) + geom_hline(yintercept = -log10(0.05), linetype = 2),再用 ggrepel 加标签。EnhancedVolcano 把同样的步骤封装在 pCutoff 和 FCcutoff 参数里。不想写代码,就把 write.csv() 保存的表格附加给火山图生成器。
怎样用 GraphPad Prism 画火山图?
用多重 t 检验分析分组表时(Prism 8 及以上),Prism 会自动画出火山图:结果中包含差值对 −log₁₀ p 的图。如果结果表是在别处生成的,就在 XY 表中把 log₂ fold change 填为 X、−log₁₀ p 填为 Y,再把阈值线作为额外的数据集加上;或者直接把那张表附加给火山图生成器。
能用 Excel 或 Python 画火山图吗?
在 Excel 里,在 p 值旁加一列 =-LOG10(C2),用差异倍数对它画 XY 散点图,每条阈值线各用一个两点系列添加;给各类别着色需要每类一个系列。在 Python 里,plt.scatter(df.log2FoldChange, -np.log10(df.padj), c=colours) 配合 plt.axvline 和 plt.axhline 能做到同样的事,adjustText 负责摆放标签。火山图生成器直接接受同一张 .xlsx 或 .csv 表格,不需要公式列。
火山图生成器能直接读取我的 DESeq2 或 Seurat 文件吗?
能:火山图生成器按列标题读取 DESeq2、edgeR、limma、Seurat 和 Perseus 的结果,支持 .csv、.tsv 或 .xlsx,最多 60,000 行。含 NA 的行会被跳过,文件中有校正后 p 时优先使用,普通的 Fold change 列会换算成 log₂。
火山图生成器会计算 p 值吗?
不会:火山图生成器从你的表格读取 p 值,从不运行统计检验。 请在 DESeq2、edgeR、limma 或你的蛋白质组学软件中完成检验;火山图生成器根据这些数字精确计算 −log₁₀ p、每个基因的类别、计数、坐标轴和阈值线。
火山图生成器会标注哪些基因?
默认情况下,火山图生成器标注最显著的十个基因,分布在上调和下调两侧。 可以写“标注前 20 个”“不加标签”,或者写出基因名(“突出显示 NANOG、SOX2 和 MYC”);指定的基因即使是灰色也会被标注。
火山图生成器最多能画多少个基因?
火山图生成器最多接受 60,000 行,足够容纳整个转录组。 200 个基因以内,每个点都画在精确坐标上。超过这个数时,最显著的基因(最多 300 个)精确定位,其余按真实的数量和分布逐条带绘制,图例中保留精确的上调、下调和不显著计数。
参考资料
- Volcano plot (statistics) — Wikipedia
- Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2 — Love, Huber & Anders, Genome Biology 15, 550 (2014)
- EnhancedVolcano: publication-ready volcano plots — Bioconductor
- FindMarkers: gene expression markers of identity classes — Seurat 参考文档,Satija Lab
- Controlling the false discovery rate: a practical and powerful approach to multiple testing — Benjamini & Hochberg, J. R. Stat. Soc. B 57, 289–300 (1995)