Introduction
tSNE plots are extremely useful for resolving and clustering flow cytometry populations so that you can both automate and discover the many different cell populations you have in a sample very quickly. tSNE models reduce all of the dimensions in a sample to one two-dimensional space, allowing you to see all of your events at once in a helpful, clustered view.
With tSNE, cells which are most closely related to each other based on all of their different parameters are also located very close to each other in a two-dimensional dot plot. Thus, similar cell types end up clustering together.
In this blog post, I’ve provided a video tutorial and a short written post about how to make tSNE plots in FlowJo. If you want to learn about tSNE in more detail and how it can be used to help you with your data analysis before beginning this tutorial, be sure to read my previous blog post.
There are several different ways to make a tSNE plot with flow cytometry data, including in R, Python, FlowJo, FCS Express, and Cytobank. All of these methods use the same algorithm and the results will essentially be the same, but certain platforms are more (R and Python) or less (FlowJo, FCS Express, and Cytobank) customizable.
The trade-off for a reduction in customization is ease-of-use and the lack of coding knowledge, both of which are required to use R and Python. Another reason I like to make tSNE in FlowJo instead of R and Python is because once the tSNE is created, I can go back and manually gate the clusters in my tSNE plot and analyze what they are. This retroactive gating is challenging to do with R or Python.
Cytobank makes my favorite plots from an aesthetic perspective, however, they are cloud-based and can be slower than both FlowJo and FCS Express in terms of maneuvering and gating the datasets. To be fair, I haven’t tried doing tSNE in FCS Express but from what I can tell, it is more than adequate to produce a tSNE plot.
Tutorial: Analyzing flow cytometry data with tSNE in FlowJo
This tutorial closely follows all of the different ways I like to analyze data with tSNE in FlowJo from my previous blog post and the post and video are intricately linked. However, I decided to do a separate post for the tutorial so that I can show you HOW it’s done, rather than explain why I do it.
When I run tSNE, I do so partially supervised. This means that I utilize pre-clustering cleaning steps so as to only feed the algorithm high-quality data points. I don’t want the algorithm to take into account false positive events that can be introduced as a result of a disruption of laminar flow during acquisition, or from dead cells. I also don’t want to give the algorithm any doublets or cell aggregates. After your sample is cleaned, you can make the decision about whether you want to pre-gate with any fluorescent parameters prior to running the algorithm. In this example I am only interested in NK cells which are CD3-, so I don’t want the algorithm to look at CD3+ cells at all. Thus, I clean all of my data first, gate on CD3- events, and THEN allow it to automatically gate and cluster the different types of NK cells.
The first step is to gate out time-based artefacts.The reason for this is because during a flow cytometry run, sometimes small air bubbles or clogs can appear in the stream and cause false positives to show up in your data. Gating these artefacts out is essential for high-quality data analysis.

Next, you’ll need to draw a loose gate around your cells or population of interest. Don’t be afraid to include cells that you’re not interested in at the expense of not including cells that are important to you.

Your next cleaning step is to gate out doublets, so that only cells which flow through the stream one cell at a time are included.

If you want to identify unknown cell populations to help you make gating decisions, you would next locate unknown populations on your FSC x SSC plots to see if they should be included:

Once you’re done with the above cleaning steps, you’ll (optionally) gate on your live, type-specific cells of interest. In this case, I am only interested in NK cells, which do not express CD3, so I have chosen to remove all CD3+ cells from my analysis.

Now onto the exciting part – running tSNE! First you’ll need to save your workspace, and then highlight the population on which you want to run your tSNE. After this, select the tSNE option from the menu and specify the parameters that you want the algorithm to include in its analysis.

Once your tSNE has finished running, now you can customize your dot plot to appear in your preferred visualization.

You can also create heatmaps in order to show where on the tSNE map the cells that express those parameters are located. Be sure to scale each parameter so that the differences between population parameter expression are highlighted.

Pulling each of those heatmaps into a layout editor allows you to look at all of those parameters and where they are located at highest density on the map at once.

A second way to identify the different clusters is by gating around each of the clusters you can visually see…

…and then creating histograms of what markers they express.

You can also manually gate known populations and see where they fall on the tSNE plot.

And lastly (and this requires some basic R skills) you can identify what each population is with a heatmap of the MFI of each fluorochrome.

tSNE has tons of great uses and I think analyzing data with tSNE plots is incredibly insightful and also pretty fun. I hope you find this tutorial useful and please contact me or leave a comment if you have any questions!
Great content! Super high-quality! Keep it up! 🙂