Julia中对字典数据做UMAP降维后如何给散点图添加字典键标签
操作步骤
核心问题是你在将字典转为矩阵时,没有保留矩阵列和原字典ID的对应关系,只要固定ID和矩阵列的匹配顺序,再调用Plots的标注参数即可实现需求,具体修改如下:
- 构造矩阵时固定ID顺序
因为Julia原生Dict是无序结构,必须在拼接矩阵时同步记录每一列对应的ID,避免后续标签错位:
# 替换your_dict为你实际的字典变量名 id_list = collect(keys(your_dict)) # 严格按照id_list的顺序拼接向量为矩阵,每一列对应一个ID的特征向量 mat = hcat([your_dict[id] for id in id_list]...)
注意:如果你已经提前生成好了mat,必须找到生成mat时对应的ID顺序,不能重新调用
keys(your_dict)获取id_list,否则Dict遍历顺序变化会导致标签和点完全不匹配。
- 原有UMAP降维代码无需修改,保持原有逻辑即可:
embedding = umap(mat, 2; n_neighbors=15, min_dist=0.001, n_epochs=200) println(size(embedding))
- 修改绘图代码,添加ID标签和散点颜色区分
使用Plots的series_annotations参数添加点标签,通过marker_z参数实现散点按ID区分颜色:
using Plots scatter( embedding[1, :], embedding[2, :], # 按ID数值映射散点颜色,不需要分色可以删除该行 marker_z = id_list, # 每个散点下方标注对应ID,8为字号,可按需调整 series_annotations = text.(string.(id_list), 8, :bottom), legend = false, xlabel = "UMAP维度1", ylabel = "UMAP维度2" )
可选调整
- 如果觉得全量标签过于密集,可以自定义要显示的标签数组替换
series_annotations的传入值,仅标注需要关注的ID - 如果不想用渐变色区分点,可以传入自定义颜色数组给
markercolor参数,实现固定配色 - 调整
text()的位置参数(比如:top、:left)可以修改标签相对于散点的位置,避免遮挡
内容的提问来源于stack exchange,提问作者Josie G
相关产品推荐
相关产品推荐

