How to Analyze Flow Cytometry Data: A Step-by-Step Guide

Master flow cytometry analysis from .fcs files to publication figures with proper gating and compensation.

Flow cytometry data analysis trips up more scientists than the staining protocol itself. You can run a beautiful panel and completely misinterpret the data by gating incorrectly or handling compensation wrong. This tutorial walks you through the analysis from opening your .fcs files to a publishable figure.

Before You Start: What You Need

Before opening any software, gather these essentials:

FlowJo v10 or compatible software. FlowJo is the industry standard, but alternatives like Cytobank or open-source tools like FlowCore in R work similarly. FlowJo is worth learning because it’s what you’ll encounter in most labs.

.fcs files from your experiment. An .fcs file is a binary data format that stores per-event data for each detector channel. Every cell or bead passing through the cytometer generates one “event.” Each event has values for forward scatter (FSC), side scatter (SSC), and every fluorescence channel you measured. The .fcs format is standardized, so files from any cytometer (BD, Beckman, Sony) open in the same analysis software.

Single-color compensation controls. For multicolor panels, compensation is non-negotiable. You need one sample for each fluorophore stained with that fluorophore alone, plus an unstained control. These are cell suspensions (the same cell type as your experimental samples, or as close as possible) or beads stained with each fluorophore individually. If your experimental samples are human T cells, your compensation controls should also be human T cells or compensation beads designed for human samples. Do not mix cell types; spectral spillover patterns differ.

FMO (Fluorescence Minus One) controls if doing multicolor. An FMO control contains all your fluorophores except one. If your panel is CD4-FITC, CD8-PE, and CD25-APC, your FMO controls are (1) CD4-FITC + CD8-PE, (2) CD4-FITC + CD25-APC, and (3) CD8-PE + CD25-APC. These define the gate threshold for each marker in the context of spillover from your other markers. This is critical and often skipped by mistake.

Viability dye data. Whether you used Live/Dead viability dye, propidium iodide, or 7-AAD, you need this channel. Dead cells show up as bright events and skew your populations if not removed.

Setting Up Compensation: The Foundation

Compensation corrects for spectral spillover. When two fluorophores have overlapping emission spectra, signal from one channel “spills” into another. The compensation matrix mathematically removes this spillover before you gate.

Step 1: Open FlowJo and Create a New Workspace

Launch FlowJo. Create a new workspace (File > New Workspace). This is your analysis project file where all your gating, statistics, and layouts are stored.

Step 2: Drag In All .fcs Files

From the file browser, drag your single-color compensation controls and unstained control into the workspace. Do not add your experimental samples yet. Create a folder called “Compensation Controls” to keep them organized.

Step 3: Create the Compensation Matrix

In FlowJo, go to Workspace > Edit Compensation or right-click the compensation controls folder and select “Create Compensation Matrix.”

FlowJo will prompt you to pair each control file with its corresponding fluorophore. This is where accuracy matters. If you tell FlowJo that a CD8-PE control is actually CD4-FITC, the compensation matrix will be backwards.

Select all single-color controls at once, and FlowJo calculates spillover by comparing the bright population in the stained control to the dim population in the unstained control for each channel pair.

Step 4: Inspect the Spillover Values

After FlowJo calculates compensation, review the matrix. Open the compensation editor (Workspace > Edit Compensation > Matrix tab). You’ll see a table of spillover percentages.

Reasonable spillover values typically range from 1% to 30% depending on your fluorophore combination. If you see 0.1% spillover (too low, suggesting the software didn’t detect the population) or 80% spillover (too high, suggesting misidentified populations or cells that were improperly gated), investigate.

A common mistake: using beads for compensation when your experimental cells are nucleated. Bead autofluorescence and light-scattering properties differ from cells, so the compensation matrix will be off. If your samples are cells, compensate with cells.

Step 5: Apply the Matrix to All Samples

Once satisfied with the matrix, select all experimental sample files and apply the compensation. In FlowJo, right-click your experimental samples folder and select “Apply Compensation” > [select your matrix]. All samples are now corrected.

At this point, your data is mathematically adjusted for spectral spillover. The next step is removing doublets, debris, and dead cells.

Quality Control and Gating Hierarchy

Gating is the process of drawing regions (gates) on scatter plots to isolate populations. The order of gates matters; gates should follow a logical hierarchy that removes artifacts first, then isolates populations of interest.

The Standard Gating Strategy

Gate 1: Time Gate (if needed). Some flow cytometers record a time parameter. Occasionally, instrument performance drifts during a run, and early events differ from late events. To check, plot FSC vs. Time. If you see a systematic drift (the population moves), create a time gate to exclude the drifting region. Most labs skip this unless troubleshooting.

Gate 2: FSC vs. SSC (Forward vs. Side Scatter). This scatter plot separates cells by size and granularity. Debris (small, low SSC), dead cells (low FSC), and healthy singlets cluster in different regions. Draw a gate around the healthy cell population (typically high FSC, moderate SSC). Exclude debris in the lower left. This is your singlet population before accounting for doublets.

Gate 3: Singlet Gate (FSC-H vs. FSC-A). FSC-H is height (peak of the signal), FSC-A is area (total signal). Doublets are two cells passing together, so they have higher FSC-A than singlets of the same height. Plot FSC-H (x-axis) vs. FSC-A (y-axis). Singlets cluster on a diagonal line; doublets fall above it. Draw a gate to exclude the doublet region. Do this for SSC as well (SSC-H vs. SSC-A) if you want to be thorough.

Gate 4: Viability Gate. Plot your viability dye channel vs. FSC or SSC. Live cells are negative (low fluorescence); dead cells are bright. Draw a gate to include only the live population. This removes permeabilized cells that have taken up dye.

Gate 5: Marker-Specific Gates. After removing debris, doublets, and dead cells, gate on your populations of interest (e.g., CD4+ T cells, CD8+ T cells, regulatory T cells).

Example with axis labels:

  • Gate 1 (Singlets): FSC-A (4th Decade) vs. SSC-A (3rd Decade), diagonal region
  • Gate 2 (Viable): Viability Dye (4th Decade) vs. FSC-A (4th Decade), lower-left region
  • Gate 3 (CD4+): CD4 fluorescence (3rd to 4th Decade) vs. SSC-A, upper-right region
  • Gate 4 (CD4+ CD8+): This is a subset of CD4+ cells, plotted by CD8 intensity

Gating on Your Populations: FMO Controls and Boolean Logic

Now that debris and dead cells are removed, gate on your markers of interest.

Using FMO Controls to Set Gate Thresholds

The most common mistake: gating on marker-positive populations using unstained or isotype controls as reference. Both are wrong. Unstained cells have no fluorescence to suppress baseline noise, so you’ll set gates too low. Isotype controls are antibodies to irrelevant proteins, which can still have non-specific binding.

FMO controls are the correct reference. An FMO control contains all fluorophores except one. When you gate on CD8, use the FMO control lacking CD8 (i.e., the control with CD4 and CD25 but not CD8). This FMO shows where CD8-negative cells cluster when your other markers are present. Your CD8+ gate begins where this FMO population ends.

Drawing a Gate

In FlowJo, plot CD8 (your marker of interest) on one axis against FSC or another marker on the second axis. Overlay your FMO control on the plot (Workspace > Add Overlay > select FMO file). The FMO population (shown in a different color) defines the threshold. Draw your gate above/to the right of the FMO population to capture CD8+ cells.

Repeat for each marker.

Boolean Gates for Complex Phenotypes

If you want cells that are CD4+ AND CD25+, use a Boolean AND gate. In FlowJo, create a subset by right-clicking Gate 3 (CD4+) and selecting “Create Subset” > “New Boolean Gate.” Name it “CD4+ CD25+” and define it as: CD4+ AND CD25+. This ensures you’re capturing only cells in both populations simultaneously, not cells in either population.

Copying Gates Across Samples

Once you’ve gated your first sample, copy the gates to all other samples. In FlowJo, select your gated sample, right-click the gates folder, and choose “Copy Gates.” Select all experimental samples and paste. FlowJo will apply the same gate regions to each file.

Critical step: visually inspect each sample after pasting gates. Open each gated file and verify that the gates are in the right position. Some samples may have different staining intensity or forward scatter distributions, and a gate that’s correct for Sample 1 may be slightly off for Sample 10. Adjust as needed.

Statistics and Exporting Results

Once all samples are gated, extract statistics (population frequencies, absolute counts, and median fluorescence intensity) for downstream analysis.

Setting Up a Statistics View

In FlowJo, create a Statistics view. Right-click a population (e.g., CD4+ CD8+) and select “Create Statistics View.” Choose the statistics you want:

  • Frequency of Parent (%): The percentage of the parent gate (e.g., CD4+ CD8+ cells as a percentage of viable CD4+ cells)
  • Frequency of Grandparent (%): The percentage of a higher-order gate (e.g., CD4+ CD8+ as a percentage of all viable cells)
  • Absolute Count: The number of events in the gate (useful if you ran beads for absolute counting)
  • Median Fluorescence Intensity (MFI): The median value of fluorescence for each marker within the gated population

Generate the statistics view for all your populations of interest. FlowJo will produce a table showing these metrics for each sample.

Exporting to a Spreadsheet

Right-click the statistics view and select “Export.” Save as a .csv or .xlsx file. Open in Excel or import directly into R or Prism for downstream analysis (statistical tests, graphing, etc.).

Exporting Publication-Quality Plots

FlowJo’s Layout Editor creates polished figures suitable for publication. Go to Workspace > New Layout Editor. Add scatter plots of your gated populations. For each plot:

  1. Select the plot and right-click “Layout Options”
  2. Adjust axis scale (usually 4 decades of logarithmic scale for fluorescence channels, linear for scatter)
  3. Add axis labels (e.g., “CD4 (FITC)” on the x-axis)
  4. Add population labels (e.g., “CD4+” or “CD8+”) inside the gated region
  5. Adjust figure size to match journal requirements (typically 3.5 inches wide for a single-column figure, or 7 inches for two-column)

Export as PDF or high-resolution TIFF (File > Export Layout as Image). Most journals accept PDF directly; TIFF at 300 DPI is a safe fallback.

Common Mistakes and How to Fix Them

Mistake 1: Using the wrong compensation controls. If your experimental cells are human T cells and you use mouse compensation beads, the compensation matrix will not match your actual samples. The spillover pattern is different. Solution: Always compensate with the same cell type (or equivalent) as your experimental samples.

Mistake 2: Gating on a lineage marker that compensation affected. If compensation mathematically altered a fluorescence channel, gates drawn before compensation may not apply after. Always gate on the compensated data. In FlowJo, ensure your gates are applied after compensation is active.

Mistake 3: Not using FMO controls. FMO controls are not optional for multicolor panels. Without them, you’ll set gate thresholds too low (if using unstained) or too high (if using isotype). Solution: Prepare FMOs for every marker in your panel.

Mistake 4: Copying gates without checking. Paste gates into all samples, then open each one and verify the gates are sensible. If Sample 5 has lower staining intensity than Sample 1, the gate position may need adjustment. Do not assume pasted gates are correct for every sample.

Mistake 5: Forgetting to gate out dead cells. Dead cells are often bright in multiple channels (because they’ve taken up viability dye), and they’ll skew your population frequencies. Always gate dead cells out before calculating statistics.

Next Steps

Now that you have gated data and exported statistics, your analysis is ready for downstream work:

Statistical analysis. Import your statistics table into Prism or R to perform t-tests, ANOVAs, or more complex statistical models. Compare populations between treatment groups.

Higher-dimensional analysis. If you have 8+ markers and want to discover populations without pre-defining gates, consider UMAP or t-SNE analysis. Cytobank and FlowJo both offer these plugins. These tools create a 2D projection of high-dimensional data and can reveal subpopulations you didn’t gate for.

Visualizing your results. Create bar graphs of population frequencies (e.g., “CD4+ cells as a percentage of lymphocytes”), heatmaps of MFI across conditions, or dot plots of marker expression.

Your gated data and statistics are now ready for a manuscript figure or further exploration. For a thorough grounding in the theory behind everything you’ve done here — compensation, gating strategy, population statistics — Flow Cytometry: First Principles by Alice Givan is the clearest reference available.