Menu

Differential Expression Analysis

Create Publication-Ready Volcano Plots in Seconds

Volcano plots are the standard for visualizing differential gene expression from RNA-seq, proteomics, or metabolomics experiments. Plotivy generates them from a single prompt - complete with significance thresholds, gene labels, and journal-ready styling.

What Is a Volcano Plot?

A volcano plot is a scatter plot that displays statistical significance (-log10 p-value) on the Y-axis against biological effect size (log2 fold change) on the X-axis. It earned its name from its characteristic shape - two "eruptions" of significant genes on either side.

X-axis

log2(Fold Change) - measures magnitude of expression change. Values >1 or <-1 are biologically meaningful.

Y-axis

-log10(p-value) - measures statistical significance. Higher = more significant. FDR correction is standard.

Color coding

Red = upregulated, Blue = downregulated, Gray = not significant. Label top hits.

Live Code Lab: Volcano Plot

This fully-commented Python code creates a publication-ready volcano plot. Edit the thresholds, colors, or gene labels - changes render instantly.

Live Code Editor
Code EditorPython
Loading editor...
Live Preview

Preparing preview

Running once automatically on first load

Learn by Experimenting

This is a safe playground for learning! Try changing:

  • • Colors: Modify color values to see different palettes
  • • Numbers: Adjust sizes, positions, or data ranges
  • • Labels: Update titles, axis names, or legends

Edit the code, run it, then open the full data visualization tool to continue with your own dataset.

Key customization tips

  • Change thresholds: modify p < 0.05 and fc > 1 in the classification loop
  • Adjust colors: swap the hex codes in the color list - red/blue/gray is conventional but not mandatory
  • Label more genes: change [:8] to [:15] in the annotation loop
  • Use your data: replace the hard-coded arrays with a CSV load via pd.read_csv()

When to Use a Volcano Plot

Perfect for

  • -RNA-seq differential expression (DESeq2, edgeR, limma-voom)
  • -Proteomics quantification (TMT, label-free, DIA)
  • -Metabolomics fold-change analysis
  • -GWAS Manhattan-style significance overview
  • -Any experiment with effect size + p-value pairs

Common mistakes

  • -Using raw p-values instead of FDR-adjusted (inflates significance)
  • -Symmetric thresholds when biology is asymmetric
  • -Labeling too many genes (clutters the plot)
  • -Missing the fold-change cutoff lines
  • -Not showing counts in the legend

Bonus: GO Enrichment Dot Plot

Volcano plots often appear alongside enrichment analyses. This companion dot plot shows functional categories of your differentially expressed genes - ideal for a supplementary figure.

Live Code Editor
Code EditorPython
Loading editor...
Live Preview

Preparing preview

Running once automatically on first load

Learn by Experimenting

This is a safe playground for learning! Try changing:

  • • Colors: Modify color values to see different palettes
  • • Numbers: Adjust sizes, positions, or data ranges
  • • Labels: Update titles, axis names, or legends

Edit the code, run it, then open the full data visualization tool to continue with your own dataset.

From Raw Data to Figure in 4 Steps

1

Upload DESeq2 output

CSV or TSV with gene names, log2FC, p-values, and padj columns

2

Describe your plot

"Create a volcano plot, label top 10 genes, use padj < 0.05"

3

Customize interactively

Adjust thresholds, colors, labels, and font sizes in the live editor

4

Export at 300 DPI

Download PNG, PDF, or TIFF ready for Nature, Science, or Cell

Why Researchers Choose Plotivy for Volcano Plots

Automatic column detection

Plotivy AI identifies p-value, padj, log2FC, and gene name columns from any CSV format - DESeq2, edgeR, limma, or custom pipelines.

Smart threshold placement

Significance lines are auto-positioned based on your data distribution. Override with a simple prompt like "use padj < 0.01".

Gene labeling engine

Top N genes labeled by significance with intelligent placement that avoids overlapping text - no manual repositioning.

Journal compliance built-in

300+ DPI, correct axis labels, proper legends, and color-blind safe palettes that meet Nature, Science, and Cell requirements.

Chart gallery

Related Biology & Genomics Charts

Explore more plot types commonly used alongside volcano plots

Browse all chart types →
Correlation heatmap with diverging color scale and coefficient annotations
Statistical•seaborn, matplotlib
From the chart gallery•Correlation analysis between variables

Heatmap

Represents data values as colors in a two-dimensional matrix format.

Sample code / prompt

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

# Create correlation matrix for financial metrics
metrics = ['Revenue', 'Profit', 'Expenses', 'ROI', 'Customers', 'AOV', 'Marketing', 'Employees']
correlation_data = np.array([
    [1.00, 0.85, -0.45, 0.72, 0.88, 0.65, 0.72, 0.55],
    [0.85, 1.00, -0.78, 0.92, 0.75, 0.58, 0.63, 0.48],
Box and whisker plot comparing gene expression across 4 genotypes with significance brackets
Distribution•seaborn, matplotlib
From the chart gallery•Comparing experimental groups in scientific research

Box and Whisker Plot

Displays data distribution using quartiles, median, and outliers in a standardized format.

Sample code / prompt

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# Generate gene expression data for 4 genotypes
np.random.seed(42)
genotypes = ['WT', 'KO1', 'KO2', 'Mutant']
n_per_group = 20
Violin plot comparing score distributions across 3 groups with inner box plots
Distribution•seaborn, matplotlib
From the chart gallery•Comparing treatment effects across groups

Violin Plot

Combines box plots with kernel density to show distribution shape across groups.

Sample code / prompt

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
from scipy.stats import f_oneway

# Generate exam score data for 3 groups
np.random.seed(42)
control = np.random.normal(72, 12, 50)
treatment_a = np.random.normal(78, 10, 50)
Scatter plot of height vs weight colored by gender with regression line
Statistical•matplotlib, seaborn
From the chart gallery•Correlation analysis between metrics

Scatterplot

Displays values for two variables as points on a Cartesian coordinate system.

Sample code / prompt

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
import pandas as pd

# Generate sample data
np.random.seed(42)
n_samples = 200
height = np.random.normal(170, 8, n_samples)
weight = height * 0.6 + np.random.normal(0, 8, n_samples) - 50
Bar chart comparing average scores across 5 groups with error bars
Comparison•matplotlib, seaborn
From the chart gallery•Comparing performance across categories

Bar Chart

Compares categorical data using rectangular bars with heights proportional to values.

Sample code / prompt

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats

# Generate performance scores for 5 treatment groups
np.random.seed(42)
groups = ['Control', 'Treatment A', 'Treatment B', 'Treatment C', 'Treatment D']
n_samples = 30

Your DESeq2 Output Deserves a Better Plot

Stop debugging ggplot2 syntax. Upload your differential expression data and get a publication-ready volcano plot in under 30 seconds.