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
相关产品推荐
相关产品推荐

