Generador de volcano plots
Un generador de volcano plots para resultados de RNA-seq, proteómica y metabolómica en artículos y tesis: genes sobreexpresados e infraexpresados separados en tus umbrales, los principales resultados etiquetados y los recuentos en la leyenda, todo calculado a partir de tu tabla.
Estilos de revista en el generador de volcano plots
Cinco acabados de revista del generador de volcano plots, cada uno con una tabla de resultados ilustrativa distinta: hígado de ratón knockout, marcadores de célula única, estrés por sequía en plantas, un microarray de fumadores y un cribado de fosfoproteómica. Haz clic en una tarjeta para cargar su instrucción y sus genes.
Ejemplos de volcano plots
Cuatro ejemplos de volcano plots del generador de volcano plots (RNA-seq, proteómica, metabolómica y un conjunto de genes etiquetado), cada uno un render real de la instrucción y la tabla de su tarjeta. Haz clic en una tarjeta para pasar su instrucción y sus genes al editor.
¿Qué es un volcano plot?
Un volcano plot (gráfico de volcán) muestra un resultado de expresión diferencial en una sola imagen: cada gen es un punto, con su log₂ fold change entre dos condiciones en el eje x y el −log₁₀ de su valor p en el eje y. Los genes que cambiaron mucho y de forma fiable suben hacia las dos esquinas superiores, mientras que los genes sin cambios forman la base baja y ancha en torno a cero, la forma que da nombre al gráfico. Las líneas discontinuas de umbral para el fold change y la significación separan los puntos en sobreexpresados, infraexpresados y no significativos.
Sobre este generador de volcano plots
- El generador de volcano plots calcula en código, a partir de tu tabla, el −log₁₀ p, la clase de cada gen, los recuentos, los dos ejes y las líneas de umbral, y entrega cada coordenada al modelo de imagen. El modelo solo los coloca.
- Los umbrales por defecto del generador de volcano plots son |log₂ fold change| ≥ 1 (un cambio de 2 veces) y p < 0.05, leído como ajustado cuando tus valores son padj, FDR o valores q. Cámbialos en la instrucción: «|log2FC| > 0.58 y padj < 0.01».
- Los fold changes simples se convierten: cuando una petición dice fold change y nunca log (lactato 3.2), el generador de volcano plots representa log₂ 3.2 = 1.68. En un archivo decide el encabezado de la columna.
- Hasta 200 genes, el generador de volcano plots coloca cada punto exactamente. Por encima, los genes más significativos se colocan exactamente y la base gris se dibuja a partir de su recuento y su forma reales, así que una tabla de 20 000 genes conserva sus recuentos reales.
Cómo leer un volcano plot, punto por punto
Veinte genes ilustrativos de una comparación de RNA-seq de interferón beta frente a tratamiento simulado, dibujados con el mismo código que ejecuta el generador de volcano plots, con |log₂FC| ≥ 1 y padj < 0.05. Los números de la figura coinciden con los pasos.
- 1
En horizontal: dirección y tamaño del cambio
x es el log₂ fold change del interferón beta respecto al simulado. 0 es sin cambio, +1 es el doble, −1 es la mitad, e IFIT1 en +5.1 es unas 34 veces mayor. La escala es simétrica, así que una reducción a la mitad queda tan a la izquierda como una duplicación a la derecha.
- 2
En vertical: evidencia, no tamaño
y es el −log₁₀ del p ajustado. La línea discontinua en 1.3 es padj 0.05, 2 es 0.01, e IFIT1 en 13.7 es padj 2 × 10⁻¹⁴. Más alto significa que es menos probable que el cambio sea ruido; no dice nada de lo grande que es el cambio.
- 3
Las esquinas superiores tienen los resultados
A la derecha de x = 1 y por encima de la línea están los seis genes sobreexpresados (IFIT1, ISG15, MX1, RSAD2, OAS1, IRF7); a la izquierda de −1, los cuatro infraexpresados (COL1A1, TGFBI, MYC, CCND1). Estos son los recuentos que publica un artículo.
- 4
Alto en el centro: significativo pero pequeño
STAT1 está en (0.7, 8.5): su cambio se mide con mucha precisión pero es solo de 1.6 veces, bajo la línea de 2 veces, así que se queda en gris. FN1 hace lo mismo más abajo, en el lado infraexpresado.
- 5
Muy lejos pero bajo: grande pero incierto
CXCL10 está en (3.9, 0.9): de media 15 veces mayor, pero su padj es 0.12. Pocas lecturas o réplicas que no coinciden dan exactamente este punto. Con estos umbrales no es un resultado, pero merece una segunda mirada.
- 6
La base gris: lo que no cambió
ACTB, GAPDH y los demás genes de mantenimiento se agolpan en torno a (0, 0). En un volcano plot de RNA-seq de todo el genoma esta base contiene la mayoría de los 15 000 a 25 000 genes analizados.
Envía estos 20 genes al generador de volcano plots, cambia luego un umbral en la instrucción y mira cómo los puntos cruzan las líneas.
Cómo usar el generador de volcano plots
Dale tus genes al generador de volcano plots
Escribe un gen por fila como nombre, log₂ fold change, p (FKBP5 3.1, 1.2e-12; CCL2 −2.2, 5e-7) o adjunta la tabla de resultados en .csv, .tsv o .xlsx. Se reconocen los encabezados de DESeq2, edgeR, limma, Seurat y Perseus, hasta 60 000 filas.
Indica la comparación y los umbrales
Escribe Tratado vs Control para el título del eje, y los umbrales si no son |log₂FC| ≥ 1 y p < 0.05 (di padj o FDR para valores ajustados). Nombra los genes que quieres etiquetar o pide los N primeros; por defecto son los diez resultados más significativos, repartidos entre los dos lados.
Elige un estilo de revista y genera
Nature, Cell Press, PLOS, Bioinformatics o un acabado preprint tipo ggplot2. El generador de volcano plots calcula coordenadas, clases, recuentos y líneas de umbral antes de que dibuje el modelo de imagen, y los recalcula en cada edición posterior.
Qué columnas de DESeq2, edgeR, limma y Seurat van en un volcano plot
Cada pipeline escribe los mismos tres números con nombres distintos. Estas son las columnas que el generador de volcano plots lee de cada tabla de resultados, así que el archivo puede adjuntarse exactamente como se exportó.
| Tabla de resultados | x: log₂ fold change | y: valor p | p ajustado (se usa primero) | Ojo con |
|---|---|---|---|---|
| DESeq2 results() | log2FoldChange | pvalue | padj | padj es NA para los genes eliminados por el filtrado independiente; esas filas se omiten. Para representar y ordenar, los autores de DESeq2 recomiendan los fold changes contraídos de lfcShrink(). |
| edgeR topTags() | logFC | PValue | FDR | El FDR es de Benjamini–Hochberg por defecto. logCPM es la expresión media, no un fold change. |
| limma topTable() | logFC | P.Value | adj.P.Val | B es el log-odds de expresión diferencial, no un valor p; déjalo fuera del eje y. |
| Seurat FindMarkers() | avg_log2FC | p_val | p_val_adj | p_val_adj está corregido por Bonferroni sobre todos los genes y a menudo es exactamente 0; esos genes se dibujan en el menor valor distinto de cero. Seurat v3 escribía avg_logFC en logaritmo natural. |
| Perseus (MaxQuant) | Difference | −Log p-value (ya en −log₁₀) | q-value | La columna −log₁₀ se reconvierte a p, para no aplicarla dos veces. |
| Tu propia hoja | log2FC | p o pvalue | padj, FDR o q | Una columna titulada Fold change, sin log, se convierte a log₂: 4 pasa a 2 y 0.25 pasa a −2. |
Cuando un archivo tiene una columna de p sin ajustar y otra ajustada, el generador de volcano plots representa y aplica el umbral a la ajustada, que es con la que suelen publicarse los resultados de DESeq2, edgeR y limma. Para representar el p sin ajustar, adjunta la hoja sin la columna ajustada.
Umbrales del volcano plot: qué cambian |log₂FC| y padj
Los dos umbrales deciden qué puntos cuentan como resultados, y son decisiones, no hechos de los datos. |log₂ fold change| ≥ 1 exige al menos una duplicación o una reducción a la mitad; padj < 0.05 acepta un 5 % esperado de falsos descubrimientos entre los genes seleccionados. Los mismos 20 genes del recorrido, con cuatro pares de umbrales, contados por el propio código del generador de volcano plots:
| Umbrales | Arriba | Abajo | No significativos | Qué cambió |
|---|---|---|---|---|
| |log₂FC| ≥ 1, padj < 0.05 (lo habitual por defecto) | 6 | 4 | 10 | STAT1 y FN1 pasan por p pero no por fold change, CXCL10 por fold change pero no por p, así que los tres siguen en gris. |
| |log₂FC| ≥ 0.58 (1.5 veces), padj < 0.05 | 7 | 5 | 8 | Un umbral de 1.5 veces deja entrar a STAT1 y FN1: cambios pequeños medidos con mucha precisión. |
| |log₂FC| ≥ 1, padj < 0.01 | 6 | 3 | 11 | El p más estricto deja fuera a CCND1 (padj 0.019). Todos los genes sobreexpresados están ya por debajo de 0.001, así que ese lado se mantiene. |
| |log₂FC| ≥ 2 (4 veces), padj < 0.001 | 5 | 1 | 14 | Solo queda la respuesta al interferón más fuerte, sin IRF7, y un gen infraexpresado, TGFBI. |
Dos despistes que evitar. Aplicar el umbral sobre padj pero representar el p sin ajustar en el eje y pone la línea horizontal donde no se aplicó ningún umbral, así que pueden quedar puntos grises por encima. Y un umbral copiado como 10e-6 de un script de R es 10 × 10⁻⁶ = 1e-5 en R, no 1e-6. Dile al generador de volcano plots qué p representas y la línea cae exactamente en ese valor.
Qué dibuja el generador de volcano plots: RNA-seq, proteómica, célula única y más
Siete volcano plots que aparecen en artículos y tesis, qué distingue a cada uno y qué decirle al generador de volcano plots para obtenerlo.
Volcano plot de RNA-seq (DESeq2, edgeR, limma-voom)
El volcano plot más común: un punto por gen de entre 15 000 y 25 000 genes analizados, con el p ajustado (padj o FDR) en el eje y. Los fold changes contraídos de lfcShrink() de DESeq2 evitan que los genes con pocas lecturas salgan disparados a ±8. Adjunta el archivo de resultados tal como se exportó; a partir de 200 genes el generador de volcano plots coloca exactamente los significativos y dibuja la base gris a partir de sus recuentos.
Volcano plot de proteómica
El cociente log₂ de intensidades de proteínas (label-free LFQ o TMT) frente al −log₁₀ p de una prueba t o de limma, normalmente para 2000 a 6000 proteínas. Etiqueta por nombre de gen en lugar de por accesión de UniProt. Perseus suele dibujar una línea de significación curva (FDR con una constante s0); el generador de volcano plots dibuja umbrales rectos, así que indica el |log₂FC| y el p que aplicaste.
Volcano plot de metabolómica y lipidómica
Los fold changes suelen darse como cocientes simples (tumor/normal = 3.2), con p de prueba t o de Wilcoxon y un FDR. Escribe fold change sin log y el generador de volcano plots convierte los valores: 3.2 se representa en 1.68 y 0.5 en −1. Lo típico son unos cientos de variables, así que cada punto se coloca exactamente.
Volcano plot de marcadores de célula única (Seurat FindMarkers)
Un clúster frente a todas las demás células, avg_log2FC en x y p_val_adj en y. Con miles de células por prueba, los valores p llegan a 10⁻⁸⁰ y menos, así que el eje y sube mucho más que en RNA-seq bulk, y muchos genes tienen p_val_adj = 0, que el generador de volcano plots dibuja en el menor valor almacenado.
Volcano plot de microarray (limma)
logFC y adj.P.Val de limma a partir de intensidades log₂, a menudo para conjuntos de sondas en lugar de genes. Los fold changes están comprimidos respecto a RNA-seq, así que es habitual un umbral de 1.5 veces (|log₂FC| ≥ 0.58). El generador de volcano plots toma la columna Symbol para las etiquetas, y el ID de sonda donde el símbolo está vacío.
Volcano plot etiquetado con genes resaltados
Un volcano plot que nombra un conjunto elegido, como la ruta de la que trata el artículo, en lugar de los primeros resultados. Escribe «resalta solo NANOG, SOX2 y MYC» y el generador de volcano plots etiqueta exactamente esos, aunque estén en gris, que a menudo es justo lo que quiere mostrar la figura.
Volcano plots de fosfoproteómica y de cribados CRISPR
Los mismos ejes para otras unidades: fosfositios (EGFR_Y1068) en fosfoproteómica, o genes de un cribado MAGeCK con el log₂ fold change de los recuentos de sus guías. Las etiquetas pueden ser nombres de sitios; dile al generador de volcano plots qué es cada punto y los títulos de los ejes lo indicarán.
Volcano plot frente a MA plot
Un volcano plot enfrenta el fold change a la significación; un MA plot enfrenta el fold change a la expresión media. Los dos salen de la misma tabla de resultados. El volcano plot responde qué genes cambiaron de forma fiable; el MA plot, si los fold changes dependen de lo mucho que se expresa un gen.
Volcano plot
MA plot
| Aspecto | Volcano plot | MA plot |
|---|---|---|
| Eje x | log₂ fold change | expresión media en escala logarítmica (A: baseMean en DESeq2, logCPM en edgeR, AveExpr en limma) |
| Eje y | −log₁₀ p o p ajustado | log₂ fold change (M) |
| Forma | una V que sube desde una base ancha en x = 0 | una banda plana en torno a M = 0 que se abre en abanico a baja expresión |
| Qué responde | qué genes cambiaron mucho y de forma fiable | si los genes con pocas lecturas inflan los fold changes, y si la normalización centró M en 0 |
| Dónde va | la figura de resultados, con los resultados etiquetados | control de calidad y figuras suplementarias |
El generador de volcano plots dibuja volcano plots. Para mostrar los mismos resultados en todas las muestras, usa el generador de mapas de calor con su expresión normalizada.
Generador de volcano plots frente a R, Prism, Python y Excel
La mayoría de los volcano plots se dibujan en R a partir de una tabla de DESeq2 o limma, en GraphPad Prism tras múltiples pruebas t, o en Python. Dónde deja el trabajo cada uno:
| Aspecto | Generador de volcano plots | R (ggplot2, EnhancedVolcano) | GraphPad Prism | Python (matplotlib) | Excel |
|---|---|---|---|---|---|
| Punto de partida | Filas escritas, o la tabla de DESeq2, edgeR, limma o Seurat tal como se exportó | Un data frame de resultados y un script | Un análisis de múltiples pruebas t, o una tabla XY de fold change y −log₁₀ p | Un DataFrame de pandas y un script | Columnas de fold change y p, más una columna auxiliar =-LOG10(C2) |
| −log₁₀ p | Calculado a partir de la tabla | -log10(padj) en aes(); EnhancedVolcano lo hace por ti | Calculado por el análisis de pruebas t | -np.log10(df.padj) | Tu fórmula |
| Líneas de umbral y colores | A partir de los umbrales que indiques (por defecto 1 y 0.05), con las clases contadas | geom_vline, geom_hline y una columna de clase; pCutoff y FCcutoff en EnhancedVolcano | Se fijan en el análisis o se dibujan como series adicionales | axvline, axhline y una columna de color | Cada línea es su propia serie; una serie por color |
| Etiquetas de genes | Los 10 más significativos, los N primeros o los genes que nombres | ggrepel, o selectLab en EnhancedVolcano | Etiquetados punto a punto | annotate o adjustText | Etiquetas de datos, una a una |
| Acabado de revista | Cinco preajustes de revista | Temas escritos a mano | Plantillas de gráficos de Prism | rcParams escritos a mano | Formato a mano |
| Qué necesitas | Un navegador | R y Bioconductor | Una licencia de Prism | Python y matplotlib | Excel |
¿Ya tienes un volcano de ggplot2 que te gusta? Adjunta una captura como imagen de referencia junto a la tabla, y el generador de volcano plots mantiene tus números siguiendo ese aspecto.
Preguntas sobre el generador de volcano plots
¿Qué muestra un volcano plot?
Qué genes cambiaron entre dos condiciones, cuánto y con qué fiabilidad, todo a la vez. Cada punto es un gen: su posición de izquierda a derecha es el log₂ fold change y su altura el −log₁₀ del valor p. Cuanto más alto y más hacia fuera está un punto, mayor y más seguro es el cambio; la base gris cerca de cero son los genes que no cambiaron.
¿Cómo se lee un volcano plot?
Lee en horizontal el tamaño y la dirección del cambio (la derecha es al alza, la izquierda a la baja, ±1 es una duplicación o una reducción a la mitad) y luego en vertical la evidencia (1.3 es p = 0.05, y cada unidad por encima es diez veces menor). Los resultados quedan en las dos esquinas superiores, fuera de las líneas discontinuas. El recorrido de arriba lee las seis regiones en un ejemplo de 20 genes.
¿Qué umbral de log₂ fold change debe usar un volcano plot?
|log₂FC| ≥ 1, un cambio de 2 veces, es el más común; 0.58 (1.5 veces) se usa donde se esperan efectos pequeños, como en proteómica, microarrays o datos de célula única. El umbral es una decisión de presentación, así que indícalo en la leyenda de la figura. En el generador de volcano plots, escríbelo en la instrucción («|log2FC| > 0.58») o como un cambio de N veces («1.5 veces»), que se convierte a log₂.
¿El eje y debe mostrar el valor p o el valor p ajustado?
El que se usó para el umbral de significación, para que la línea horizontal signifique lo que dice la leyenda. Con miles de genes analizados, la mayoría de los artículos aplican el umbral y representan el p ajustado por Benjamini–Hochberg (padj, FDR, q). El generador de volcano plots titula el eje −log₁₀(valor p ajustado) cuando los valores están ajustados y −log₁₀(valor p) en caso contrario.
¿Por qué mi volcano plot está descompensado?
Porque subieron más genes de los que bajaron, o al revés: un volcano plot es tan simétrico como la biología. Que toda la base gris se desplace lejos de x = 0 es otra cosa. Suele indicar un problema de normalización y conviene revisarlo en un MA plot antes de leer los resultados. El generador de volcano plots nunca refleja la nube para que parezca equilibrada.
¿Por qué los puntos se amontonan en una fila plana en lo alto de mi volcano plot?
Sus valores p eran demasiado pequeños para almacenarse y se escribieron como 0, así que −log₁₀ p es infinito y el programa de gráficos los fija a una misma altura. Es frecuente con el p_val_adj de Seurat y con RNA-seq muy profundo. El generador de volcano plots dibuja esos genes en el menor p distinto de cero de la tabla y lo indica en la figura; darlos como p < 10⁻³⁰⁰ es honesto, inventar un valor exacto no.
¿Cómo hago un volcano plot en R?
Con ggplot2, añade una columna de clase (al alza, a la baja, no significativo) y luego 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), con ggrepel para las etiquetas. EnhancedVolcano reúne los mismos pasos en sus argumentos pCutoff y FCcutoff. Para saltarte el código, adjunta al generador de volcano plots la tabla que guardó write.csv().
¿Cómo hago un volcano plot en GraphPad Prism?
Prism dibuja un volcano plot automáticamente cuando analizas una tabla agrupada con múltiples pruebas t (Prism 8 y posteriores): los resultados incluyen un gráfico de la diferencia frente al −log₁₀ p. Con una tabla de resultados hecha en otro sitio, introduce el log₂ fold change como X y el −log₁₀ p como Y en una tabla XY y añade las líneas de umbral como conjuntos de datos adicionales, o adjunta esa tabla al generador de volcano plots.
¿Puedo hacer un volcano plot en Excel o en Python?
En Excel, añade una columna =-LOG10(C2) junto a los valores p, haz una dispersión XY del fold change frente a ella y añade cada línea de umbral como su propia serie de dos puntos; colorear las clases exige una serie por clase. En Python, plt.scatter(df.log2FoldChange, -np.log10(df.padj), c=colours) con plt.axvline y plt.axhline hace lo mismo, y adjustText coloca las etiquetas. El generador de volcano plots acepta la misma hoja en .xlsx o .csv sin columna de fórmula.
¿Puede el generador de volcano plots leer directamente mi archivo de DESeq2 o Seurat?
Sí: el generador de volcano plots lee los resultados de DESeq2, edgeR, limma, Seurat y Perseus por los encabezados de sus columnas, en .csv, .tsv o .xlsx, hasta 60 000 filas. Las filas con NA se omiten, se usa el p ajustado cuando el archivo lo tiene y una columna Fold change simple se convierte a log₂.
¿El generador de volcano plots calcula los valores p?
No: el generador de volcano plots lee los valores p de tu tabla y nunca ejecuta la estadística. Haz la prueba en DESeq2, edgeR, limma o tu programa de proteómica; a partir de esos números el generador de volcano plots calcula exactamente el −log₁₀ p, la clase de cada gen, los recuentos, los ejes y las líneas de umbral.
¿Qué genes etiqueta el generador de volcano plots?
Por defecto el generador de volcano plots etiqueta los diez resultados más significativos, repartidos entre el lado sobreexpresado y el infraexpresado. Escribe «etiqueta los 20 primeros», «sin etiquetas» o nombra los genes («resalta NANOG, SOX2 y MYC»); los genes nombrados se etiquetan aunque estén en gris.
¿Cuántos genes puede dibujar el generador de volcano plots?
El generador de volcano plots admite hasta 60 000 filas, suficiente para un transcriptoma completo. Hasta 200 genes, cada punto se coloca en sus coordenadas exactas. Por encima, los genes más significativos (hasta 300) se colocan exactamente y el resto se dibuja a partir de sus recuentos y su dispersión reales, franja a franja, mientras la leyenda conserva los recuentos exactos de sobreexpresados, infraexpresados y no significativos.
Fuentes
- 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 — Referencia de 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)
Sigue explorando
Nuestras otras herramientas de diagramas y las guías que las explican.
Pon tu tabla de resultados en el generador de volcano plots
Pega los genes o adjunta el archivo de DESeq2, edgeR, limma o Seurat, y el generador de volcano plots te devuelve una figura con estilo de revista, con umbrales, recuentos y etiquetas exactos.
Abrir el generador de volcano plots