Générateur de volcano plot
Un générateur de volcano plot pour les résultats de RNA-seq, de protéomique et de métabolomique des articles et des thèses : gènes surexprimés et sous-exprimés séparés à vos seuils, principaux hits étiquetés et effectifs dans la légende, le tout calculé à partir de votre table.
Styles de revue du générateur de volcano plot
Cinq finitions de revue du générateur de volcano plot, chacune sur une table de résultats fictive différente : foie de souris knock-out, marqueurs single-cell, stress hydrique chez une plante, puce à ADN sur le tabagisme et criblage de phosphoprotéomique. Cliquez sur une carte pour charger son prompt et ses gènes.
Exemples de volcano plots
Quatre exemples de volcano plots tirés du générateur de volcano plot (RNA-seq, protéomique, métabolomique et un ensemble de gènes étiquetés), chacun rendu réellement à partir du prompt et de la table de sa carte. Cliquez sur une carte pour placer son prompt et ses gènes dans le champ de saisie.
Qu’est-ce qu’un volcano plot ?
Un volcano plot montre un résultat d’expression différentielle en une seule image : chaque gène est un point, avec son log₂ fold change entre deux conditions sur l’axe des x et le −log₁₀ de sa valeur de p sur l’axe des y. Les gènes qui ont beaucoup et sûrement changé montent dans les deux coins supérieurs, tandis que les gènes inchangés forment la base basse et large autour de zéro, la forme qui donne son nom au graphique. Des lignes de seuil pointillées pour le fold change et la significativité séparent les points en surexprimés, sous-exprimés et non significatifs.
À propos de ce générateur de volcano plot
- Le générateur de volcano plot calcule par du code, à partir de votre table, −log₁₀ p, la classe de chaque gène, les effectifs, les deux axes et les lignes de seuil, et transmet chaque coordonnée au modèle d’image. Le modèle ne fait que les placer.
- Les seuils par défaut du générateur de volcano plot sont |log₂ fold change| ≥ 1 (un facteur 2) et p < 0,05, lu comme ajusté quand vos valeurs sont des padj, FDR ou q-values. Modifiez-les dans le prompt : « |log2FC| > 0.58 and padj < 0.01 ».
- Les fold changes simples sont convertis : quand une demande parle de fold change sans jamais mentionner de log (lactate 3.2), le générateur de volcano plot trace log₂ 3,2 = 1,68. Pour un fichier, c’est l’en-tête de colonne qui décide.
- Jusqu’à 200 gènes, le générateur de volcano plot place chaque point exactement. Au-delà, les gènes les plus significatifs sont placés exactement et la base grise est dessinée d’après son effectif et sa forme réels, si bien qu’une table de 20 000 gènes garde ses vrais effectifs.
Comment lire un volcano plot, point par point
Vingt gènes fictifs d’une comparaison RNA-seq entre interféron bêta et traitement mock, tracés par le même code que celui du générateur de volcano plot, à |log₂FC| ≥ 1 et padj < 0,05. Les numéros de la figure correspondent aux étapes.
- 1
En largeur : sens et ampleur du changement
x est le log₂ fold change de l’interféron bêta par rapport au mock. 0 signifie aucun changement, +1 deux fois plus, −1 moitié moins, et IFIT1 à +5,1 est environ 34 fois plus élevé. L’échelle est symétrique : une division par deux est aussi loin à gauche qu’un doublement à droite.
- 2
En hauteur : la preuve, pas l’ampleur
y est le −log₁₀ du p ajusté. La ligne pointillée à 1,3 correspond à padj 0,05, 2 à 0,01, et IFIT1 à 13,7 a un padj de 2 × 10⁻¹⁴. Plus haut signifie que le changement a moins de chances d’être du bruit ; cela ne dit rien de sa taille.
- 3
Les coins supérieurs contiennent les hits
À droite de x = 1 et au-dessus de la ligne se trouvent les six gènes surexprimés (IFIT1, ISG15, MX1, RSAD2, OAS1, IRF7) ; à gauche de −1, les quatre sous-exprimés (COL1A1, TGFBI, MYC, CCND1). Ce sont les effectifs qu’un article rapporte.
- 4
Haut au milieu : significatif mais faible
STAT1 est à (0,7 ; 8,5) : son changement est mesuré très précisément mais ne vaut qu’un facteur 1,6, sous la ligne du facteur 2, il reste donc gris. FN1 fait de même plus bas, du côté sous-exprimé.
- 5
Loin mais bas : fort mais incertain
CXCL10 est à (3,9 ; 0,9) : en moyenne 15 fois plus élevé, mais son padj vaut 0,12. Peu de lectures ou des réplicats discordants donnent exactement ce point. Ce n’est pas un hit à ces seuils, mais il mérite un second regard.
- 6
La base grise : ce qui n’a pas changé
ACTB, GAPDH et les autres gènes de ménage se pressent autour de (0 ; 0). Dans un volcano plot de RNA-seq pangénomique, cette base contient la plupart des 15 000 à 25 000 gènes testés.
Envoyez ces 20 gènes au générateur de volcano plot, puis modifiez un seuil dans le prompt et regardez des points franchir les lignes.
Comment utiliser le générateur de volcano plot
Donnez vos gènes au générateur de volcano plot
Saisissez un gène par ligne sous la forme nom, log₂ fold change, p (FKBP5 3.1, 1.2e-12; CCL2 −2.2, 5e-7) ou joignez la table de résultats en .csv, .tsv ou .xlsx. Les en-têtes de DESeq2, edgeR, limma, Seurat et Perseus sont reconnus, jusqu’à 60 000 lignes.
Indiquez la comparaison et les seuils
Écrivez Traité vs Contrôle pour le titre de l’axe, et les seuils s’ils ne sont pas |log₂FC| ≥ 1 et p < 0,05 (précisez padj ou FDR pour des valeurs ajustées). Nommez les gènes à étiqueter ou demandez les N premiers ; par défaut, ce sont les dix hits les plus significatifs, répartis des deux côtés.
Choisissez un style de revue et générez
Nature, Cell Press, PLOS, Bioinformatics ou une finition preprint proche de ggplot2. Le générateur de volcano plot calcule coordonnées, classes, effectifs et lignes de seuil avant que le modèle d’image ne dessine, et les recalcule à chaque retouche.
Quelles colonnes DESeq2, edgeR, limma et Seurat vont sur un volcano plot
Chaque pipeline écrit les trois mêmes nombres sous des noms différents. Voici les colonnes que le générateur de volcano plot lit dans chaque table de résultats, pour que le fichier puisse être joint exactement tel qu’il a été exporté.
| Table de résultats | x : log₂ fold change | y : valeur de p | p ajustée (prioritaire) | Points de vigilance |
|---|---|---|---|---|
| DESeq2 results() | log2FoldChange | pvalue | padj | padj vaut NA pour les gènes écartés par le filtrage indépendant ; ces lignes sont ignorées. Pour tracer et classer, les auteurs de DESeq2 recommandent les fold changes rétrécis de lfcShrink(). |
| edgeR topTags() | logFC | PValue | FDR | Le FDR est de Benjamini–Hochberg par défaut. logCPM est une expression moyenne, pas un fold change. |
| limma topTable() | logFC | P.Value | adj.P.Val | B est le log-odds d’expression différentielle, pas une valeur de p ; ne le mettez pas sur l’axe des y. |
| Seurat FindMarkers() | avg_log2FC | p_val | p_val_adj | p_val_adj est corrigé par Bonferroni sur tous les gènes et vaut souvent exactement 0 ; ces gènes sont dessinés à la plus petite valeur non nulle. Seurat v3 écrivait avg_logFC en logarithme népérien. |
| Perseus (MaxQuant) | Difference | −Log p-value (déjà en −log₁₀) | q-value | La colonne en −log₁₀ est reconvertie en p, pour ne pas être prise deux fois. |
| Votre propre feuille | log2FC | p ou pvalue | padj, FDR ou q | Une colonne intitulée Fold change, sans log, est convertie en log₂ : 4 devient 2, 0,25 devient −2. |
Quand un fichier contient à la fois une colonne de p brute et une colonne de p ajustée, le générateur de volcano plot trace et seuille la p ajustée, celle avec laquelle les résultats DESeq2, edgeR et limma sont habituellement rapportés. Pour tracer la p brute, joignez la feuille sans la colonne ajustée.
Seuils du volcano plot : ce que changent |log₂FC| et padj
Les deux seuils décident quels points comptent comme hits, et ce sont des choix, pas des faits tirés des données. |log₂ fold change| ≥ 1 exige au moins un doublement ou une division par deux ; padj < 0,05 accepte une proportion attendue de 5 % de fausses découvertes parmi les gènes retenus. Les 20 mêmes gènes que dans l’exemple commenté, sous quatre couples de seuils, comptés par le code du générateur de volcano plot :
| Seuils | Surexprimés | Sous-exprimés | Non significatifs | Ce qui a bougé |
|---|---|---|---|---|
| |log₂FC| ≥ 1, padj < 0,05 (le réglage habituel) | 6 | 4 | 10 | STAT1 et FN1 passent sur p mais pas sur le fold change, CXCL10 sur le fold change mais pas sur p : les trois restent gris. |
| |log₂FC| ≥ 0,58 (facteur 1,5), padj < 0,05 | 7 | 5 | 8 | Un seuil au facteur 1,5 fait entrer STAT1 et FN1 : de petits changements mesurés très précisément. |
| |log₂FC| ≥ 1, padj < 0,01 | 6 | 3 | 11 | Le p plus strict fait sortir CCND1 (padj 0,019). Tous les gènes surexprimés sont déjà sous 0,001 : ce côté ne bouge pas. |
| |log₂FC| ≥ 2 (facteur 4), padj < 0,001 | 5 | 1 | 14 | Il ne reste que la réponse interféron la plus forte, sans IRF7, et un seul gène sous-exprimé, TGFBI. |
Deux erreurs à éviter. Seuiller sur padj mais tracer la p brute sur l’axe des y place la ligne horizontale là où aucun seuil n’a été appliqué, si bien que des points gris peuvent se retrouver au-dessus. Et un seuil recopié comme 10e-6 depuis un script R vaut 10 × 10⁻⁶ = 1e-5 dans R, pas 1e-6. Dites au générateur de volcano plot quelle p vous tracez, et la ligne tombe exactement à cette valeur.
Ce que trace le générateur de volcano plot : RNA-seq, protéomique, single-cell et plus
Sept volcano plots que l’on rencontre dans les articles et les thèses, ce qui distingue chacun et ce qu’il faut dire au générateur de volcano plot pour l’obtenir.
Volcano plot de RNA-seq (DESeq2, edgeR, limma-voom)
Le volcano plot le plus courant : un point par gène parmi 15 000 à 25 000 gènes testés, avec la p ajustée (padj ou FDR) sur l’axe des y. Les fold changes rétrécis de lfcShrink() de DESeq2 empêchent les gènes à faible comptage de s’envoler jusqu’à ±8. Joignez le fichier de résultats tel qu’exporté ; au-delà de 200 gènes, le générateur de volcano plot place exactement les gènes significatifs et dessine la base grise d’après ses effectifs.
Volcano plot de protéomique
Rapport en log₂ des intensités protéiques (label-free LFQ ou TMT) en fonction du −log₁₀ p d’un test t ou de limma, en général pour 2 000 à 6 000 protéines. Étiquetez par nom de gène plutôt que par identifiant UniProt. Perseus trace souvent une ligne de significativité courbe (FDR avec une constante s0) ; le générateur de volcano plot trace des seuils droits, indiquez donc le |log₂FC| et le p que vous avez appliqués.
Volcano plot de métabolomique et de lipidomique
Les fold changes sont souvent rapportés en rapports simples (tumeur/normal = 3,2), avec une p de test t ou de Wilcoxon et un FDR. Écrivez fold change sans log et le générateur de volcano plot convertit les valeurs : 3,2 est tracé à 1,68 et 0,5 à −1. Quelques centaines de variables sont typiques, si bien que chaque point est placé exactement.
Volcano plot de marqueurs single-cell (Seurat FindMarkers)
Un cluster contre toutes les autres cellules, avg_log2FC en x et p_val_adj en y. Avec des milliers de cellules par test, les valeurs de p descendent à 10⁻⁸⁰ et en dessous, l’axe des y monte donc bien plus haut qu’en RNA-seq bulk, et beaucoup de gènes ont p_val_adj = 0, que le générateur de volcano plot dessine à la plus petite valeur stockée.
Volcano plot de puce à ADN (limma)
Le logFC et l’adj.P.Val de limma à partir d’intensités en log₂, souvent pour des probe sets plutôt que des gènes. Les fold changes sont comprimés par rapport au RNA-seq, si bien qu’un seuil au facteur 1,5 (|log₂FC| ≥ 0,58) est courant. Le générateur de volcano plot prend la colonne Symbol pour les étiquettes, et l’identifiant de sonde quand le symbole est vide.
Volcano plot étiqueté avec gènes mis en évidence
Un volcano plot qui nomme un ensemble choisi, comme la voie dont parle l’article, plutôt que les principaux hits. Écrivez « highlight only NANOG, SOX2 and MYC » et le générateur de volcano plot étiquette exactement ceux-là, même gris, ce qui est souvent tout l’intérêt de la figure.
Volcano plots de phosphoprotéomique et de criblage CRISPR
Les mêmes axes pour d’autres unités : des phosphosites (EGFR_Y1068) en phosphoprotéomique, ou des gènes d’un criblage MAGeCK avec le log₂ fold change de leurs comptages de guides. Les étiquettes peuvent être des noms de sites ; dites au générateur de volcano plot ce que représente un point, et les titres des axes l’indiquent.
Volcano plot ou MA plot
Un volcano plot met le fold change en regard de la significativité ; un MA plot le met en regard de l’expression moyenne. Les deux viennent de la même table de résultats. Le volcano plot répond à la question des gènes qui ont changé de façon fiable ; le MA plot, à celle de savoir si les fold changes dépendent du niveau d’expression d’un gène.
Volcano plot
MA plot
| Critère | Volcano plot | MA plot |
|---|---|---|
| Axe des x | log₂ fold change | expression moyenne sur échelle logarithmique (A : baseMean dans DESeq2, logCPM dans edgeR, AveExpr dans limma) |
| Axe des y | −log₁₀ p ou p ajustée | log₂ fold change (M) |
| Forme | un V qui s’élève d’une large base à x = 0 | une bande plate autour de M = 0 qui s’évase aux faibles expressions |
| Ce qu’il montre | quels gènes ont beaucoup et sûrement changé | si les gènes à faible comptage gonflent les fold changes, et si la normalisation a bien centré M sur 0 |
| Où il va | la figure de résultats, hits étiquetés | contrôle qualité et figures supplémentaires |
Le générateur de volcano plot trace des volcano plots. Pour montrer les mêmes hits sur chaque échantillon, utilisez le générateur de carte de chaleur avec leur expression normalisée.
Générateur de volcano plot, R, Prism, Python ou Excel
La plupart des volcano plots sont tracés dans R à partir d’une table DESeq2 ou limma, dans GraphPad Prism après des tests t multiples, ou en Python. Voici où chacun place le travail :
| Critère | Générateur de volcano plot | R (ggplot2, EnhancedVolcano) | GraphPad Prism | Python (matplotlib) | Excel |
|---|---|---|---|---|---|
| Point de départ | Lignes saisies, ou la table DESeq2, edgeR, limma ou Seurat telle qu’exportée | Un data frame de résultats et un script | Une analyse par tests t multiples, ou une table XY de fold change et de −log₁₀ p | Un DataFrame pandas et un script | Colonnes de fold change et de p, plus une colonne auxiliaire =-LOG10(C2) |
| −log₁₀ p | Calculé à partir de la table | -log10(padj) dans aes() ; EnhancedVolcano le fait pour vous | Calculé par l’analyse des tests t | -np.log10(df.padj) | Votre formule |
| Lignes de seuil et couleurs | D’après vos seuils (1 et 0,05 par défaut), classes comptées | geom_vline, geom_hline et une colonne de classe ; pCutoff et FCcutoff dans EnhancedVolcano | Réglées dans l’analyse ou tracées en séries supplémentaires | axvline, axhline et une colonne de couleur | Chaque ligne en série propre ; une série par couleur |
| Étiquettes de gènes | Les 10 premiers par significativité, les N premiers, ou les gènes que vous nommez | ggrepel, ou selectLab dans EnhancedVolcano | Un point étiqueté à la fois | annotate ou adjustText | Étiquettes de données, une par une |
| Finition de revue | Cinq préréglages de revue | Thèmes écrits à la main | Modèles de graphiques Prism | rcParams écrits à la main | Mise en forme à la main |
| Ce qu’il vous faut | Un navigateur | R et Bioconductor | Une licence Prism | Python et matplotlib | Excel |
Vous avez déjà un volcano plot ggplot2 qui vous plaît ? Joignez-en une capture d’écran comme image de référence à côté de la table : le générateur de volcano plot garde vos nombres tout en suivant cette allure.
Générateur de volcano plot : vos questions
Que montre un volcano plot ?
Quels gènes ont changé entre deux conditions, de combien et avec quelle fiabilité, tout à la fois. Chaque point est un gène : sa position gauche–droite est le log₂ fold change, sa hauteur le −log₁₀ de la valeur de p. Plus un point est haut et éloigné du centre, plus le changement est grand et sûr ; la base grise près de zéro, ce sont les gènes qui n’ont pas changé.
Comment lire un volcano plot ?
Lisez en largeur pour l’ampleur et le sens du changement (à droite surexprimé, à gauche sous-exprimé, ±1 correspond à un doublement ou à une division par deux), puis en hauteur pour la preuve (1,3 correspond à p = 0,05, et chaque unité au-dessus est dix fois plus petite). Les hits se trouvent dans les deux coins supérieurs, hors des lignes pointillées. La lecture commentée ci-dessus parcourt les six zones sur un exemple de 20 gènes.
Quel seuil de log₂ fold change un volcano plot doit-il utiliser ?
|log₂FC| ≥ 1, soit un facteur 2, est le plus courant ; 0,58 (facteur 1,5) s’utilise quand on attend de petits effets, comme en protéomique, sur puces à ADN ou en single-cell. Le seuil est un choix de présentation : indiquez-le dans la légende de la figure. Dans le générateur de volcano plot, écrivez-le dans le prompt (« |log2FC| > 0.58 ») ou sous forme de facteur (« 1.5-fold »), converti en log₂.
L’axe des y doit-il montrer la valeur de p ou la p ajustée ?
Celle à laquelle le seuil de significativité a été appliqué, pour que la ligne horizontale veuille dire ce qu’annonce la légende. Avec des milliers de gènes testés, la plupart des articles seuillent et tracent la p ajustée de Benjamini–Hochberg (padj, FDR, q). Le générateur de volcano plot intitule l’axe −log₁₀(valeur de p ajustée) quand les valeurs sont ajustées et −log₁₀(valeur de p) sinon.
Pourquoi mon volcano plot est-il déséquilibré ?
Parce que plus de gènes ont augmenté que diminué, ou l’inverse : un volcano plot n’est symétrique que si la biologie l’est. Un décalage de toute la base grise loin de x = 0, c’est autre chose. Il signale en général un problème de normalisation et mérite une vérification sur un MA plot avant de lire les hits. Le générateur de volcano plot ne retourne jamais le nuage en miroir pour lui donner l’air équilibré.
Pourquoi des points s’alignent-ils en une rangée plate en haut de mon volcano plot ?
Leurs valeurs de p étaient trop petites pour être stockées et ont été écrites 0 : −log₁₀ p est infini et le logiciel de tracé les plafonne à une même hauteur. C’est courant avec le p_val_adj de Seurat et le RNA-seq très profond. Le générateur de volcano plot dessine ces gènes à la plus petite p non nulle de la table et le signale sur la figure ; les rapporter comme p < 10⁻³⁰⁰ est honnête, inventer une valeur exacte ne l’est pas.
Comment faire un volcano plot dans R ?
Avec ggplot2, ajoutez une colonne de classe (up, down, non significatif), puis 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), avec ggrepel pour les étiquettes. EnhancedVolcano regroupe les mêmes étapes dans ses arguments pCutoff et FCcutoff. Pour éviter le code, joignez au générateur de volcano plot la table enregistrée par write.csv().
Comment faire un volcano plot dans GraphPad Prism ?
Prism trace automatiquement un volcano plot quand vous analysez une table groupée par tests t multiples (Prism 8 et suivants) : les résultats comprennent un graphique de la différence en fonction de −log₁₀ p. À partir d’une table de résultats faite ailleurs, entrez le log₂ fold change en X et −log₁₀ p en Y dans une table XY et ajoutez les lignes de seuil comme jeux de données supplémentaires, ou joignez cette table au générateur de volcano plot.
Peut-on faire un volcano plot dans Excel ou en Python ?
Dans Excel, ajoutez une colonne =-LOG10(C2) à côté des valeurs de p, faites un nuage de points XY du fold change en fonction de cette colonne, et ajoutez chaque ligne de seuil comme série de deux points ; colorer les classes demande une série par classe. En Python, plt.scatter(df.log2FoldChange, -np.log10(df.padj), c=colours) avec plt.axvline et plt.axhline fait la même chose, et adjustText place les étiquettes. Le générateur de volcano plot prend la même feuille en .xlsx ou .csv sans colonne de formule.
Le générateur de volcano plot peut-il lire directement mon fichier DESeq2 ou Seurat ?
Oui : le générateur de volcano plot lit les résultats DESeq2, edgeR, limma, Seurat et Perseus par leurs en-têtes de colonnes, en .csv, .tsv ou .xlsx, jusqu’à 60 000 lignes. Les lignes avec NA sont ignorées, la p ajustée est utilisée quand le fichier en a une, et une colonne Fold change simple est convertie en log₂.
Le générateur de volcano plot calcule-t-il les valeurs de p ?
Non : le générateur de volcano plot lit les valeurs de p dans votre table et ne fait jamais les statistiques. Lancez le test dans DESeq2, edgeR, limma ou votre logiciel de protéomique ; à partir de ces nombres, le générateur de volcano plot calcule exactement −log₁₀ p, la classe de chaque gène, les effectifs, les axes et les lignes de seuil.
Quels gènes le générateur de volcano plot étiquette-t-il ?
Par défaut, le générateur de volcano plot étiquette les dix hits les plus significatifs, répartis entre les côtés surexprimé et sous-exprimé. Écrivez « label the top 20 », « no labels », ou nommez les gènes (« highlight NANOG, SOX2 and MYC ») ; les gènes nommés sont étiquetés même gris.
Combien de gènes le générateur de volcano plot peut-il tracer ?
Le générateur de volcano plot accepte jusqu’à 60 000 lignes, assez pour un transcriptome entier. Jusqu’à 200 gènes, chaque point est placé à ses coordonnées exactes. Au-delà, les gènes les plus significatifs (jusqu’à 300) sont placés exactement et les autres sont dessinés d’après leurs effectifs et leur répartition réels, bande par bande, tandis que la légende garde les effectifs exacts de surexprimés, sous-exprimés et non significatifs.
Sources
- Volcano plot (statistics) — Wikipedia (en anglais)
- 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 — Documentation de référence 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)
À explorer aussi
Nos autres outils de schémas, et les guides qui vont avec.
Outils
Confiez votre table de résultats au générateur de volcano plot
Collez les gènes ou joignez le fichier DESeq2, edgeR, limma ou Seurat : le générateur de volcano plot vous rend une figure au style d’une revue, avec seuils, effectifs et étiquettes exacts.
Ouvrir le générateur de volcano plot