火山圖工具

火山圖產生器

給論文和學位論文中 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 常氧

火山圖產生器裡的 label-free 蛋白質體學,使用 log₂ 比值和 t 檢定 p 值。

代謝體學(一般倍數變化)

代謝體學表格中的一般倍數變化;火山圖產生器畫的是它們的 log₂。

標出六個指定基因

寫出基因名稱,火山圖產生器就只標註那幾個,不論是不是灰色。

什麼是火山圖?

火山圖用一張圖呈現差異表現分析的結果:每個基因是一個點,x 軸是它在兩個條件之間的 log₂ 倍數變化(fold change),y 軸是其 p 值的 −log₁₀。變化大又可靠的基因升到左右兩個上角,沒有變化的基因則在 0 附近形成低而寬的底部,這個形狀就是火山圖名稱的由來。倍數變化和顯著性的虛線閾值把點分成上調、下調和不顯著三類。

關於這個火山圖產生器

  • 火山圖產生器以程式從你的表格算出 −log₁₀ p、每個基因的類別、數量、兩條座標軸和閾值線,再把每個座標交給影像模型。模型只負責擺放。
  • 火山圖產生器預設的閾值是 |log₂ fold change| ≥ 1(2 倍變化)和 p < 0.05,當你的數值是 padj、FDR 或 q 值時就視為校正後的 p。可以在提示詞裡修改:「|log2FC| > 0.58 and padj < 0.01」。
  • 一般倍數變化會自動換算:請求中寫 fold change 而沒有提到 log 時(lactate 3.2),火山圖產生器會畫在 log₂ 3.2 = 1.68。檔案則改由欄位標題判斷。
  • 200 個基因以內,火山圖產生器把每個點都精確列出。超過時,最顯著的基因精確擺放,灰色底部依真實數量和形狀繪製,所以 20,000 個基因的表格也保有真實的數量。

火山圖怎麼看:一個點一個點讀

二十個示意基因,來自干擾素 β 處理對比 mock 處理的 RNA-seq 比較,以火山圖產生器執行的同一套程式繪製,閾值為 |log₂FC| ≥ 1 和 padj < 0.05。圖上的編號對應下面的步驟。

20 個示意基因的火山圖,干擾素 β 對比 mock:右上角六個上調基因以 IFIT1 為首,左上角四個下調基因以 COL1A1 為首,STAT1 很高但落在倍數變化線之內,CXCL10 在最右邊但低於顯著性線,灰色的無變化基因在底部−6−4−20246051015log₂ fold change(干擾素 β / Mock)−log₁₀(校正後 p 值)CXCL10STAT1COL1A1TGFBIIFIT1ISG15RSAD21233456
逐步解說用的表格經火山圖產生器排版後的樣子:虛線位於 log₂ fold change ±1 和 −log₁₀ 0.05 = 1.3,顯著基因上色,其餘為灰色。
  1. 1

    橫向:變化的方向和大小

    x 是干擾素 β 相對於 mock 的 log₂ 倍數變化。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₂ 倍數變化、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被 independent filtering 排除的基因 padj 為 NA,這些列會被略過。DESeq2 作者建議作圖和排序時使用 lfcShrink() 的收縮倍數變化。
edgeR topTags()logFCPValueFDRFDR 預設為 Benjamini–Hochberg 法。logCPM 是平均表現量,不是倍數變化。
limma topTable()logFCP.Valueadj.P.ValB 是差異表現的 log-odds,不是 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)。每個上調基因本來就低於 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₂ 比值(label-free 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。

突顯指定基因的標註火山圖

標註一組指定基因(例如論文主題的路徑)而不是最顯著基因的火山圖。寫「highlight only NANOG, SOX2 and MYC」,火山圖產生器就只標註這幾個,即使它們是灰色,而這往往正是這張圖的重點。

磷酸化蛋白質體學與 CRISPR 篩選火山圖

同樣的座標軸,用在其他單位上:磷酸化蛋白質體學的磷酸化位點(EGFR_Y1068),或 MAGeCK 篩選中以 guide 計數 log₂ 倍數變化表示的基因。標籤可以是位點名稱;告訴火山圖產生器一個點代表什麼,座標軸標題就會寫出來。

火山圖與 MA 圖的差別

火山圖把倍數變化對顯著性作圖;MA 圖把倍數變化對平均表現量作圖。兩者都來自同一份結果表。火山圖回答哪些基因的變化可靠;MA 圖回答倍數變化是否取決於基因的表現量高低。

火山圖

MA 圖

比較項目火山圖MA 圖
x 軸log₂ fold change對數尺度的平均表現量(A:DESeq2 的 baseMean、edgeR 的 logCPM、limma 的 AveExpr)
y 軸p 或校正後 p 的 −log₁₀log₂ fold change (M)
形狀從 x = 0 寬底部升起的 V 字形M = 0 附近的平坦帶,在低表現量處呈扇形散開
回答什麼哪些基因變化大又可靠低計數基因是否灌大了倍數變化,以及標準化是否把 M 置中於 0
放在哪裡結果圖,標註顯著基因品質管制和補充圖

火山圖產生器畫的是火山圖。若要在每個樣本中呈現同一批顯著基因,請用它們的標準化表現量搭配熱圖產生器。

火山圖產生器 vs R、Prism、Python 和 Excel

多數火山圖是在 R 中從 DESeq2 或 limma 表格畫出,或在 GraphPad Prism 做完多重 t 檢定後畫出,或用 Python 畫。各工具把工作放在哪裡:

比較項目火山圖產生器R (ggplot2, EnhancedVolcano)GraphPad PrismPython (matplotlib)Excel
起點輸入的列,或原樣匯出的 DESeq2、edgeR、limma 或 Seurat 表格一個結果 data frame 加一支腳本多重 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₂ 倍數變化,高度是 −log₁₀ p 值。點越高、越往外,變化越大也越確定;0 附近的灰色底部是沒有變化的基因。

火山圖怎麼看?

橫向看變化的大小和方向(右邊是上調,左邊是下調,±1 代表加倍或減半),再往上看證據強度(1.3 是 p = 0.05,往上每一單位就小十倍)。顯著基因落在虛線外的兩個上角。上方的逐步解說用一個 20 個基因的例子讀過全部六個區域。

火山圖該用多少的 log₂ 倍數變化閾值?

最常用的是 |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)設閾值並作圖。數值是校正後的值時,火山圖產生器把座標軸標題寫成 −log₁₀(校正後 p 值),否則寫成 −log₁₀(p 值)。

我的火山圖為什麼一邊大一邊小?

因為上調的基因比下調的多,或反過來:火山圖對不對稱,取決於生物學本身。整個灰色底部偏離 x = 0 則是另一回事,通常表示標準化有問題,解讀顯著基因之前值得先用 MA 圖檢查。火山圖產生器絕不會為了看起來平衡而鏡像翻轉點雲。

為什麼火山圖頂端有一排點平平地堆在一起?

它們的 p 值小到存不下而被寫成 0,所以 −log₁₀ p 是無限大,繪圖軟體把它們壓在同一個高度。這在 Seurat 的 p_val_adj 和極深度 RNA-seq 中很常見。火山圖產生器把這些基因畫在表中最小的非零 p 上,並在圖上註明;報告成 p < 10⁻³⁰⁰ 是誠實的,捏造一個精確值則不是。

怎麼用 R 畫火山圖?

用 ggplot2,先加一欄類別(up、down、not significant),再寫 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₂ 倍數變化填成 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、每個基因的類別、數量、座標軸和閾值線。

火山圖產生器會標註哪些基因?

火山圖產生器預設標註最顯著的十個基因,分布在上調和下調兩側。可以寫「label the top 20」、「no labels」,或寫出基因名稱(「highlight NANOG, SOX2 and MYC」);指定的基因即使是灰色也會標註。

火山圖產生器最多能畫多少個基因?

火山圖產生器最多接受 60,000 列,足以放下整個轉錄體。200 個基因以內,每個點都畫在精確座標上。超過時,最顯著的基因(最多 300 個)精確擺放,其餘依真實的數量和分布逐帶繪製,圖例仍保留精確的上調、下調和不顯著數量。

把你的結果表放進火山圖產生器

貼上基因或附加 DESeq2、edgeR、limma 或 Seurat 檔案,火山圖產生器就會交回一張期刊風格的圖,閾值、數量和標籤都精確。

開啟火山圖產生器