umap本身仅执行降维,不提供可视化功能;其fit_transform()返回二维坐标数组,需配合matplotlib等库用scatter绘图并手动添加颜色、图例等元素。

UMAP 本身不是可视化工具,它只做降维;可视化必须用 matplotlib、seaborn 或 plotly 等库配合完成。
为什么直接 reducer.fit_transform() 后不能“自动出图”
UMAP 的 fit_transform() 返回的是一个 NumPy 数组(比如 shape 为 (n_samples, 2)),它只包含坐标点,没有颜色、标签、图例、坐标轴等任何可视化元素。这就像拿到一张只有经纬度坐标的地图底图,你还得自己标城市名、画国界、加图例。
常见错误现象包括:
- 运行完
embedding = reducer.fit_transform(X)后屏幕一片空白,以为代码卡住或失败 - 误以为
umap.UMAP().plot()存在(实际不存在) - 把 embedding 当作图像对象直接
plt.show(),结果报错TypeError: object of type 'numpy.ndarray' has no len()
最简可行的可视化三步法
只要记住三件事:降维 → 散点 → 上色。不需要额外封装函数,5 行内搞定。
- 用
umap.UMAP(n_components=2)生成降维器,调用fit_transform()得到二维坐标embedding - 用
plt.scatter(embedding[:, 0], embedding[:, 1])画散点,x 和 y 分别取第 0、1 列 - 通过
c参数传入标签(如y)、连续值(如X[:, 0])或自定义数组控制颜色 - 补上
plt.colorbar()(对连续色)或plt.legend()(对离散类)提升可读性
示例(鸢尾花数据):
import umap
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
X, y = load_iris(return_X_y=True)
embedding = umap.UMAP().fit_transform(X)
plt.scatter(embedding[:, 0], embedding[:, 1], c=y, cmap='Spectral', s=15)
plt.colorbar(ticks=[0, 1, 2], label='Species')
plt.title('UMAP projection of Iris')
plt.show()
n_neighbors 和 min_dist 怎么影响图的“观感”
这两个参数不决定“能不能画出来”,但极大影响你从图里能“看出什么”。它们不是调参玄学,而是对数据局部密度和簇间分离度的显式声明:
-
n_neighbors=5:每个点只认 5 个最近邻,适合细节丰富、簇多且小的数据(如单细胞亚群),但容易把本该连通的区域切碎 -
n_neighbors=50:视野变广,“朋友圈”扩大,图更平滑、簇更紧凑,但可能抹掉亚结构(比如把两个相近但生物学意义不同的细胞类型压成一团) -
min_dist=0.1:强制点与点之间保持最小距离,图看起来“松散”,簇边界清晰,适合强调分离性 -
min_dist=0.01:允许点堆叠,簇内部更致密,但不同簇可能粘连,尤其在样本量大时易出现视觉重叠
典型组合建议:n_neighbors=15 + min_dist=0.1 是大多数中等规模结构化数据(如图像特征、用户行为向量)的稳妥起点。
3D 可视化要多写两行,但别默认开启
3D 图表面看更“立体”,实际常因视角遮挡、深度感知失真反而降低可读性。除非你明确需要旋转观察或导出交互式 HTML,否则坚持 2D。
如果真要 3D:
- 必须设
n_components=3,否则embedding只有两列,第三维会索引报错 - 必须用
mpl_toolkits.mplot3d.Axes3D创建三维坐标系,plt.scatter()默认是二维的 - 交互式查看推荐
plotly.express.scatter_3d(),一行代码带旋转缩放,比 Matplotlib 原生 3D 更实用
关键陷阱:用 plt.scatter(embedding[:, 0], embedding[:, 1], embedding[:, 2]) 会静默失败——Matplotlib 把第三个参数当 size(点大小),不是 z 坐标。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











