An R implementation of the Uniform Manifold Approximation and Projection (UMAP) method for dimensionality reduction of McInnes et al. (2018). Also included are the supervised and metric (out-of-sample) learning extensions to the basic method. Translated from the Python implementation.
August 29 2026 uwot version 0.2.5 has been released to CRAN. This is to
apply fixes for some minor issues surfaced by CRAN checks (transitive headers
in the C++ code caught by clang, a deprecation in test code) but there are
some other minor changes for nearest neighbor calculations. See the
NEWS.md for details.
install.packages("uwot")
uwot makes use of C++ code which must be compiled. You may have to carry out
a few extra steps before being able to build this package:
Windows: install
Rtools and ensure
C:\Rtools\bin is on your path.
Mac OS X: using a custom ~/.R/Makevars
may cause linking errors.
This sort of thing is a potential problem on all platforms but seems to bite
Mac owners more.
The R for Mac OS X FAQ
may be helpful here to work out what you can get away with. To be on the safe
side, I would advise building uwot without a custom Makevars.
install.packages("devtools")
# devtools::install_github("jlmelville/uwot")
install.packages("uwot", repos = c('https://jlmelville.r-universe.dev', 'https://cloud.r-project.org'))
library(uwot)
# umap2 is a version of the umap() function with better defaults
iris_umap <- umap2(iris)
# but you can still use the umap function (which most of the existing
# documentation does)
iris_umap <- umap(iris)
# Load mnist from somewhere, e.g.
# devtools::install_github("jlmelville/snedata")
# mnist <- snedata::download_mnist()
mnist_umap <- umap(mnist, n_neighbors = 15, min_dist = 0.001, verbose = TRUE)
plot(
mnist_umap,
cex = 0.1,
col = grDevices::rainbow(n = length(levels(mnist$Label)))[as.integer(mnist$Label)] |>
grDevices::adjustcolor(alpha.f = 0.1),
main = "R uwot::umap",
xlab = "",
ylab = ""
)
# I recommend the following optional packages
# for faster or more flexible nearest neighbor search:
install.packages(c("RcppHNSW", "rnndescent"))
library(RcppHNSW)
library(rnndescent)
# Installing RcppHNSW will allow the use of the usually faster HNSW method:
mnist_umap_hnsw <- umap(mnist, n_neighbors = 15, min_dist = 0.001,
nn_method = "hnsw")
# nndescent is also available
mnist_umap_nnd <- umap(mnist, n_neighbors = 15, min_dist = 0.001,
nn_method = "nndescent")
# umap2 will choose HNSW by default if available
mnist_umap2 <- umap2(mnist)

https://jlmelville.github.io/uwot/. For more examples see the get started doc. There are plenty of articles describing various aspects of the package.
If you want to cite the use of uwot, then use the output of running
citation("uwot") (you can do this with any R package).
uwot's arrival on CRAN.uwot uses the RcppProgress
package to show a text-based progress bar when verbose = TRUE.