火山圖產生器
給論文和學位論文中 RNA-seq、蛋白質體學和代謝體學結果用的火山圖產生器:上調和下調基因依你的閾值分開,最顯著的基因加上標籤,圖例附上數量,全部從你的結果表算出。
火山圖產生器的期刊風格
火山圖產生器的五種期刊樣式,各搭配一份不同的示意結果表:基因剔除小鼠肝臟、單細胞標記基因、植物乾旱逆境、吸菸者微陣列,以及磷酸化蛋白質體篩選。點選卡片即可載入它的提示詞和基因。
火山圖範例
四張火山圖範例都出自火山圖產生器(RNA-seq、蛋白質體學、代謝體學和一組標註基因),各是依卡片上的提示詞和表格實際算繪的圖。點選卡片即可把它的提示詞和基因放進輸入框。
什麼是火山圖?
火山圖用一張圖呈現差異表現分析的結果:每個基因是一個點,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。圖上的編號對應下面的步驟。
- 1
橫向:變化的方向和大小
x 是干擾素 β 相對於 mock 的 log₂ 倍數變化。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₂ 倍數變化、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 | 被 independent filtering 排除的基因 padj 為 NA,這些列會被略過。DESeq2 作者建議作圖和排序時使用 lfcShrink() 的收縮倍數變化。 |
| edgeR topTags() | logFC | PValue | FDR | FDR 預設為 Benjamini–Hochberg 法。logCPM 是平均表現量,不是倍數變化。 |
| limma topTable() | logFC | P.Value | adj.P.Val | B 是差異表現的 log-odds,不是 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)。每個上調基因本來就低於 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₂ 比值(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 Prism | Python (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 和 Bioconductor | Prism 授權 | Python 和 matplotlib | Excel |
已經有喜歡的 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 個)精確擺放,其餘依真實的數量和分布逐帶繪製,圖例仍保留精確的上調、下調和不顯著數量。
資料來源
- 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 reference, 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)