You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib散点图图例缺失:23类仅显示9类技术求助

解决Matplotlib散点图图例仅显示部分类别的问题

我一眼就看出问题出在points.legend_elements()这个方法上——它默认会自动估算要展示的图例项数量,不会主动匹配你数据里的全部23个类别,这就是为啥你明明有23类却只看到9个图例的原因。

下面给你两种可行的解决思路,直接套进你的代码里就能用:

方法一:给legend_elements()指定类别总数

修改vis函数里的ax.legend()部分,手动传入num参数,值为你的类别总数,这样就能强制显示所有类别的图例:

def vis(ax, df, label_num, label_name, alpha=0.7, s=10, title="visualization", vis=False):
    points = ax.scatter(df.iloc[:, 0], df.iloc[:, 1], c=label_num, label=label_name, edgecolor='none',alpha=0.7, s=s)
    ax.spines["top"].set_visible(vis)
    ax.spines["right"].set_visible(vis)
    ax.set_title(title)
    # 修改核心:添加num参数指定类别总数
    unique_classes = list(np.unique(label_name))
    ax.legend(handles=points.legend_elements(num=len(unique_classes))[0], 
              labels=unique_classes, 
              title="Classes", 
              loc='center left', 
              bbox_to_anchor=(1, 0.5))

方法二:使用离散颜色映射(更稳妥)

如果担心数值型颜色映射出现混淆,你可以直接用离散颜色映射,确保每个类别对应唯一的颜色,图例也会更准确:

import matplotlib.colors as mcolors

def vis(ax, df, label_num, label_name, alpha=0.7, s=10, title="visualization", vis=False):
    # 生成足够多的离散颜色(确保数量≥类别数)
    unique_classes = list(np.unique(label_name))
    color_list = list(mcolors.TABLEAU_COLORS.values()) + list(mcolors.CSS4_COLORS.values())
    color_map = mcolors.ListedColormap(color_list[:len(unique_classes)])
    
    points = ax.scatter(df.iloc[:, 0], df.iloc[:, 1], c=label_num, cmap=color_map, edgecolor='none',alpha=0.7, s=s)
    ax.spines["top"].set_visible(vis)
    ax.spines["right"].set_visible(vis)
    ax.set_title(title)
    # 同样指定num参数匹配全部类别
    ax.legend(handles=points.legend_elements(num=len(unique_classes))[0], 
              labels=unique_classes, 
              title="Classes", 
              loc='center left', 
              bbox_to_anchor=(1, 0.5))

验证效果

运行修改后的代码后,你可以再次用len(df["classes"].unique())确认类别数量,此时图例会完整显示全部23个类别。

内容的提问来源于stack exchange,提问作者CSY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:22:44