火山图生成器

火山图生成器

火山图生成器,用于论文和学位论文中的 RNA-seq、蛋白质组学和代谢组学结果:按你设定的阈值分出上调和下调基因,标出最显著的基因,在图例里给出计数,全部按你的表格计算。

火山图生成器的期刊风格

火山图生成器的五种期刊样式,各配一份不同的示意结果表:敲除小鼠肝脏、单细胞标记基因、植物干旱胁迫、吸烟者芯片数据和一次磷酸化蛋白质组学筛选。点击卡片即可载入它的提示词和基因。

Nature

火山图生成器的 Nature 样式:低饱和砖红和钢蓝,基因名用斜体,不加边框。

Cell Press

火山图生成器里的 Seurat 标记基因越过 y = 80,y 轴随之缩放以容纳它们。

PLOS

对色盲友好的朱红和天蓝,标签加框:这是火山图生成器的 PLOS 样式。

Bioinformatics

火山图生成器读入的 limma 表格,样式在灰度打印时依然清晰。

预印本(ggplot2)

以磷酸化位点作标签,加一条 p < 0.01 线,采用火山图生成器的 ggplot2 外观。

火山图示例

四个来自火山图生成器的火山图示例(RNA-seq、蛋白质组学、代谢组学和一组带标注的基因),都是按卡片上的提示词和表格实际生成的。点击卡片即可把它的提示词和基因载入输入框。

RNA-seq:给药 vs 溶剂对照

火山图生成器的默认设置:十个标签,取两侧最显著的基因。

蛋白质组学:缺氧 vs 常氧

火山图生成器里的非标记定量蛋白质组学,使用 log₂ 比值和 t 检验 p 值。

代谢组学,原始倍数

代谢组学表格中的原始差异倍数;火山图生成器画的是它们的 log₂ 值。

突出显示六个指定基因

写出基因名,火山图生成器就只标这些基因,无论是否为灰色。

什么是火山图?

火山图用一张图展示差异表达分析的结果:每个基因是一个点,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。图上的编号与下面的步骤对应。

20 个示意基因的火山图,干扰素-β 对比模拟处理:右上方六个上调基因,以 IFIT1 为首;左上方四个下调基因,以 COL1A1 为首;STAT1 位置很高但在倍数线以内;CXCL10 远在右侧却低于显著性线;灰色的无变化基因位于底部−6−4−20246051015log₂ fold change(干扰素-β / 模拟处理)−log₁₀(校正后 p 值)CXCL10STAT1COL1A1TGFBIIFIT1ISG15RSAD21233456
火山图生成器排出的解读示例表:虚线位于 log₂ fold change ±1 和 −log₁₀ 0.05 = 1.3,显著基因着色,其余为灰色。
  1. 1

    横向:变化的方向和大小

    x 是干扰素-β 相对模拟处理的 log₂ fold change。0 表示无变化,+1 表示变为两倍,−1 表示减为一半,IFIT1 在 +5.1,约高 34 倍。刻度是对称的,减半在左边的距离和加倍在右边的距离相同。

  2. 2

    纵向:证据强度,不是变化大小

    y 是校正后 p 的 −log₁₀。1.3 处的虚线是 padj 0.05,2 是 0.01,IFIT1 在 13.7,即 padj 2 × 10⁻¹⁴。越高说明这个变化越不可能是噪声;它不说明变化有多大。

  3. 3

    两个上角是显著基因

    x = 1 右侧、虚线上方是六个上调基因(IFIT1、ISG15、MX1、RSAD2、OAS1、IRF7);−1 左侧是四个下调基因(COL1A1、TGFBI、MYC、CCND1)。论文报告的就是这些计数。

  4. 4

    中间偏高:显著但变化小

    STAT1 位于 (0.7, 8.5):它的变化测得非常精确,但只有 1.6 倍,低于 2 倍线,所以仍是灰色。FN1 在下调一侧、位置更低处也是这样。

  5. 5

    远离中心但位置低:变化大但不确定

    CXCL10 位于 (3.9, 0.9):平均高出 15 倍,但 padj 为 0.12。读数少或重复之间不一致,就会得到这样的点。在这组阈值下它不算显著,但值得再看一眼。

  6. 6

    灰色底座:没有变化的基因

    ACTB、GAPDH 等管家基因挤在 (0, 0) 附近。在全基因组 RNA-seq 火山图中,这个底座容纳了检测的 15,000 到 25,000 个基因中的大多数。

把这 20 个基因交给火山图生成器,然后在提示词里改一个阈值,看看哪些点越过了阈值线。

如何使用火山图生成器

1

把基因数据交给火山图生成器

每行一个基因,按 名称、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 行。

2

写明比较组和阈值

写 Treated vs Control 作为轴标题;阈值不是 |log₂FC| ≥ 1 和 p < 0.05 时也写明(校正后的值写 padj 或 FDR)。写出要标注的基因名,或者要求标出前 N 个;默认标出最显著的十个基因,两侧各占一部分。

3

选择期刊风格并生成

可选 Nature、Cell Press、PLOS、Bioinformatics 或类似 ggplot2 的预印本样式。火山图生成器在图像模型绘图之前算好坐标、类别、计数和阈值线,之后每次追加修改都会重新计算。

DESeq2、edgeR、limma 和 Seurat 的哪些列用于火山图

每种分析流程都输出同样的三个数,只是列名不同。下面是火山图生成器从各类结果表中读取的列,所以文件可以按导出时的原样附加。

结果表x:log₂ fold changey:p 值校正后 p(优先使用)注意事项
DESeq2 results()log2FoldChangepvaluepadj被独立过滤去掉的基因 padj 为 NA;这些行会被跳过。DESeq2 作者建议作图和排序时使用 lfcShrink() 收缩后的差异倍数。
edgeR topTags()logFCPValueFDRFDR 默认为 Benjamini–Hochberg 校正。logCPM 是平均表达量,不是差异倍数。
limma topTable()logFCP.Valueadj.P.ValB 是差异表达的对数优势比,不是 p 值;不要把它放到 y 轴上。
Seurat FindMarkers()avg_log2FCp_valp_val_adjp_val_adj 是对全部基因做的 Bonferroni 校正,经常正好为 0;这些基因按最小的非零值绘制。Seurat v3 输出的 avg_logFC 是自然对数。
Perseus (MaxQuant)Difference−Log p-value(已经是 −log₁₀)q-value−log₁₀ 列会先换算回 p,避免重复取对数。
你自己的表格log2FCp 或 pvaluepadj、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(常用默认值)6410STAT1 和 FN1 过了 p 值关但没过倍数关,CXCL10 过了倍数关但没过 p 值关,所以三个都还是灰色。
|log₂FC| ≥ 0.58(1.5 倍),padj < 0.057581.5 倍的阈值让 STAT1 和 FN1 进入显著区:这是测得非常精确的小变化。
|log₂FC| ≥ 1,padj < 0.016311更严格的 p 去掉了 CCND1(padj 0.019)。上调基因的 padj 本来就都低于 0.001,所以那一侧不变。
|log₂FC| ≥ 2(4 倍),padj < 0.0015114只剩下最强的干扰素应答基因,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 或校正后 plog₂ 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 PrismPython (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 和 BioconductorPrism 许可证Python 和 matplotlibExcel

已经有一张自己喜欢的 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 个)精确定位,其余按真实的数量和分布逐条带绘制,图例中保留精确的上调、下调和不显著计数。

参考资料

把你的结果表交给火山图生成器

粘贴基因,或附加 DESeq2、edgeR、limma 或 Seurat 文件,火山图生成器返回一张期刊风格的火山图,阈值、计数和标签都精确无误。

打开火山图生成器