Plotly单细胞UMAP散点图:消除重复图例,实现簇唯一标记
解决Plotly单细胞UMAP散点图图例重复问题
核心问题是绘图时未按cluster分组,导致每个数据点都生成了图例项。只需让每个cluster对应单独的绘图轨迹,就能确保图例仅显示唯一的簇编号。
方法1:使用Plotly Graph Objects手动遍历簇
这种方式灵活性高,可自定义每个簇的颜色和符号:
import plotly.graph_objects as go import pandas as pd # 从adata提取UMAP坐标和簇信息,转为DataFrame df = pd.DataFrame({ "UMAP_1": adata.obsm["X_umap"][:, 0], "UMAP_2": adata.obsm["X_umap"][:, 1], "cluster": adata.obs["cluster"].astype(str) # 转为字符串避免连续变量识别问题 }) # 自定义颜色和符号映射(可根据簇数量扩展) color_palette = ["#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", "#8c564b"] symbol_list = ["circle", "square", "diamond", "cross", "x", "triangle-up"] fig = go.Figure() # 遍历每个簇,添加独立散点轨迹 for idx, cluster_id in enumerate(df["cluster"].unique()): cluster_data = df[df["cluster"] == cluster_id] fig.add_trace(go.Scatter( x=cluster_data["UMAP_1"], y=cluster_data["UMAP_2"], mode="markers", marker=dict( color=color_palette[idx % len(color_palette)], symbol=symbol_list[idx % len(symbol_list)], size=5 ), name=cluster_id, # 图例显示的簇编号,每个簇仅出现一次 showlegend=True )) # 调整图表布局 fig.update_layout( title="UMAP 簇分布散点图", xaxis_title="UMAP 1", yaxis_title="UMAP 2", legend_title="簇编号" ) fig.show()
方法2:使用Plotly Express快速分组
Plotly Express会自动按簇分组,默认生成唯一图例,代码更简洁:
import plotly.express as px import pandas as pd # 转换adata数据为DataFrame df = pd.DataFrame({ "UMAP_1": adata.obsm["X_umap"][:, 0], "UMAP_2": adata.obsm["X_umap"][:, 1], "cluster": adata.obs["cluster"].astype(str) }) # 一键生成带唯一图例的UMAP图 fig = px.scatter( df, x="UMAP_1", y="UMAP_2", color="cluster", symbol="cluster", color_discrete_sequence=px.colors.qualitative.D3, # 内置定性配色 symbol_sequence=["circle", "square", "diamond", "cross"], labels={"cluster": "簇编号"}, title="UMAP 簇分布散点图" ) # 调整点大小和图例样式 fig.update_traces(marker=dict(size=5)) fig.update_layout(legend_title="簇编号") fig.show()
关键注意事项
- 务必将
cluster列转为字符串类型:如果簇编号是数值,Plotly可能会将其识别为连续变量,导致图例异常。 - 自定义颜色/符号时,若簇数量超过列表长度,用
%循环复用即可,避免索引越界。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

