差异表达分析跑完了,手里是一张带 log2 fold-change 和校正 p 值的基因表,现在你需要的是审稿人一定会问起的那张图:一张干净的火山图(volcano plot)。经典的 R 路线——ggplot2、EnhancedVolcano、反复调 geom_text_repel 直到标签不再重叠——确实能做出来,但当你只想改一个阈值或给某一类重新上色时,它又慢又不容人犯错。这篇指南教你只用大白话做出 RNA-seq 和差异表达的火山图:图由 AI 来搭,你把精力留给生物学本身。

读完这篇指南,你将能够:
- 不写一行代码做出 RNA-seq 火山图,坐标轴选对(log2 fold-change vs. −log10 校正 p 值)。
- 设置 fold-change 与校正 p 值的显著性阈值,并画出审稿人想看到的虚线阈值线。
- 给上调和下调基因分别上色,再用一团灰色表示不显著基因,让图一眼就读得懂。
- 标注最关键的命中基因且文字不重叠,并导出可印刷的火山图用于论文或学位论文。
下面每一步都在 SciDraw AI 编辑器 里、用 火山图生成器 完成——你把数据和意图输进去,图就出来,再用文字一点点打磨。
火山图到底在表达什么
火山图本质上是一种为差异表达而生的散点图。每一个点代表一个基因(或蛋白、或代谢物)。横轴是 log2 fold-change——表达上调(往右)或下调(往左)了多少。纵轴是 −log10 的 p 值(通常是校正后的 / FDR p 值)——也就是你的把握有多大。整张图呈现出"火山"的形状:最值得关注的基因落在两个上方角落里,那里既有大幅变化,又有统计学显著性。
它的全部意义就在于让你一眼把信号从噪声里分出来。这意味着有三件事必须清清楚楚:阈值线在哪、哪些点越过了阈值、哪几个基因值得被命名出来。
第一步:描述你想要的图
先在 编辑器 里告诉 AI 这张图是什么。坐标轴、数据类型和阈值都要讲明白——正是这些具体信息,把一张普通散点图变成一张正确的火山图。
模板: "为 [RNA-seq / 蛋白质组 / 单细胞] 差异表达做一张火山图。横轴:log2 fold-change。纵轴:−log10 校正 p 值。显著性阈值:|log2FC| > [1] 且校正 p < [0.05]。上调基因用 [红色],下调用 [蓝色],不显著用 [灰色]。加上虚线阈值线。"
一个填好的例子:
- "为一个比较处理组 vs. 对照组的 RNA-seq 实验做一张火山图。横轴 log2 fold-change,范围 −6 到 6;纵轴 −log10 校正 p 值。用 |log2FC| > 1 和校正 p < 0.05 作为阈值。上调基因用红色,下调用蓝色,不显著用灰色,并在 ±1 处画竖直虚线、在 p = 0.05 水平处画水平虚线。"
第二步:设置阈值和阈值线
阈值是这张图的核心,而且正是那种你希望不必重画就能随手改的东西。有两条阈值很关键:
- Fold-change 阈值——通常是
|log2FC| > 1(即 2 倍变化),不过0.585(1.5 倍)和2(4 倍)也很常见。 - 显著性阈值——通常用校正后的 p 值(Benjamini-Hochberg FDR),而不是原始 p 值。
0.05和0.01是标准取值。
直接用对话来调整:
- "把 fold-change 阈值改成 |log2FC| > 0.585(1.5 倍)。"
- "用校正 p < 0.01 代替 0.05,并相应地移动那条水平虚线。"
- "把阈值线改成浅灰色虚线,让它不要和数据点抢眼。"

第三步:给上调和下调基因上色
颜色是火山图易读性的关键。惯例是三色方案:一种颜色表示显著上调的基因,一种表示显著下调的,再用中性的灰色表示所有没越过阈值的点。
- "把上调基因(+1 右侧、p 阈值上方)涂成红色;下调(−1 左侧)涂蓝色;其余全部灰色、40% 不透明度。"
- "加一个图例:红 = 上调,蓝 = 下调,灰 = 不显著。"
- "把显著点画得稍大一点,不显著点画得更小、半透明。"
把不显著的那团点保持得淡一些,会把视线推向角落——故事正好在那里。
第四步:标注关键命中基因
审稿人想看到那些突出的基因被命名出来,但一墙重叠的标签比一个都不标还糟。要有所取舍,让 AI 把文字摆放得互不碰撞。
- "按校正 p 值标注前 10 个基因,用基因符号、细引导线,文字不重叠。"
- "只标注这几个基因:TP53、BRCA1、MYC、EGFR 和 CDKN1A。"
- "把最显著的 3 个上调基因的标签加粗。"
正是在这里,"描述改动"胜过手动摆放文本框:你点名要哪些命中基因,布局交给 AI。一旦整体看着对了,你还可以微调任意一个单独的标签——具体的文字修改见 如何编辑 AI 图中的文字与标签。
常见错误(以及如何修正)
- 用了原始 p 值而非校正 p 值。 多重检验的膨胀会让什么都显得显著。修正: "纵轴画 −log10 的校正(FDR)p 值,不要用原始 p 值。"
- 坐标轴不对称或被截断,掩盖了某个方向。 如果横轴只从 0 到 6,下调基因就消失了。修正: "把横轴做成以 0 为中心、从 −6 到 6 的对称轴。"
- 标签太多。 四十个重叠的基因名 = 没法看。修正: "只标注前 8 个命中基因,其余去掉。"
- 没有阈值线。 阈值是隐含的,却看不见。修正: "在 fold-change 和 p 值阈值处加虚线,让各个区域一目了然。"
- 配色忽略了方向。 所有显著基因用同一种颜色,就丢掉了上下调的故事。修正: "上调和下调基因用不同颜色区分。"
- 悄悄地给 −log10(p) 封顶。 p = 0 的基因会冲向无穷大。修正: "给纵轴封顶,并用空心箭头标出被封顶的点,这样才诚实。"
导出与使用
图做对了,就按用途导出。想要什么直接说:
- "把这张图导出成 300 DPI 的 PNG,尺寸适配期刊单栏宽度。"
- "给我一个矢量版本(SVG),方便我放进 Illustrator。"
- "导出 1200 像素宽、透明背景,用于我的幻灯片。"
火山图很少单独出现。如果你的差异表达结果要喂给一篇系统综述,或者你正在拼一张多面板的结果图,可以搭配 如何制作森林图 来汇总效应量;当某个基因名需要最后一刻修一下时,再回看 如何编辑 AI 图中的文字与标签。所有内容在 SciDraw AI 编辑器 里始终可编辑。
常见问题
不写代码怎么做 RNA-seq 火山图? 打开 火山图生成器,描述你的比较(处理组 vs. 对照组),说明你的 log2 fold-change 和校正 p 值阈值,AI 就会把图搭出来。你通过打字来调整颜色、标签和阈值——不需要 R 或 Python。
火山图该用什么阈值?
最常见的默认值是 |log2FC| > 1(2 倍变化)和校正 p 值 < 0.05。更严格的研究会用 |log2FC| > 1 配合校正 p < 0.01。一定要用校正后(FDR)的 p 值而非原始 p 值,并在图注中写明你的阈值。
纵轴该用原始 p 值还是校正 p 值? 用校正 p 值(Benjamini-Hochberg / FDR),以 −log10 的形式绘制。RNA-seq 一次检验数以万计的基因,用原始 p 值会把太多基因标成显著。画 −log10(校正 p) 才能让你的显著基因集站得住脚。
怎么只标注最重要的几个基因? 让 AI 按校正 p 值标注前 N 个基因,或者直接点名你关心的具体基因。要求用细引导线、文字不重叠,这样即使在密集的图里标签也清晰可读。
蛋白质组或代谢组也能做火山图吗? 可以。同样的坐标轴和阈值适用于任何差异丰度实验——蛋白质组、代谢组或单细胞。只要告诉 火山图生成器 数据类型和你的阈值,它就会相应调整标签和配色。
现在就做你的火山图
别再跟 geom_text_repel 死磕了。描述你的差异表达数据,设好阈值,让 AI 画出一张干净、带标签、可发表的图。打开 火山图生成器,或直接进入 SciDraw AI 编辑器,几分钟内做好你的火山图。



