Python绘制交互式UMAP图时如何显示类别颜色图例
UMAP交互式绘图添加类别图例实现方案
umap.plot.interactive() 接口默认不会像静态绘图接口那样自动渲染图例,你当前代码还存在参数传参问题:把唯一值的sampleID传给了做颜色编码的labels参数,这种情况下就算生成图例,也会每个样本对应一个图例项,完全没有可读性。
结合你给出的表结构(第一列样本ID、第二列样本类别、其余为特征),直接调整参数、开启图例配置即可实现需求,不需要重写整体绘图逻辑。
修正后可直接运行的代码
import umap import umap.plot import pandas as pd import numpy as np # 拟合UMAP模型,保留原有特征选择逻辑 mapper = umap.UMAP(n_neighbors=50, min_dist=0.5).fit(pretrained_df.iloc[:,2:130]) # 配置悬停展示数据:仅保留需要查看的样本ID hover_data = pd.DataFrame({ 'index': np.arange(len(pretrained_df)), 'sampleID': pretrained_df.iloc[:, 0] }) umap.plot.output_notebook() # 核心修正:labels传入类别列,新增legend参数指定图例位置 p = umap.plot.interactive( mapper, labels=pretrained_df.iloc[:, 1], # 第二列为样本类别,用于颜色编码 hover_data=hover_data, theme='fire', point_size=2, # 适当调大点大小方便鼠标悬停选中 legend='top_right' # 指定图例渲染位置,支持传入'top_left'/'bottom_right'等位置参数 ) # 可选:调整图例交互和样式 p.legend.title = '样本类别' p.legend.click_policy = 'hide' # 点击图例类别可临时隐藏/显示对应类别的点 p.legend.label_text_font_size = '10pt' umap.plot.show(p)
注意事项
- 如果你使用的umap-learn版本低于0.5,没有内置
legend参数,因为接口底层返回的是标准Bokeh绘图对象,你可以直接通过Bokeh的Legend组件手动添加图例,逻辑和普通Bokeh绘图加图例完全一致。 - 不建议用
sampleID作为颜色编码的标签传入,样本量稍大时不仅图例完全不可用,颜色映射也会出现大量重复辨识度极低,类别字段做颜色编码、悬停看样本ID是更合理的交互逻辑。
内容的提问来源于stack exchange,提问作者TheyTakingTheHobbitsToIsengard
相关产品推荐
相关产品推荐

