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

Matplotlib散点图图例异常及循环绘图问题求解

Matplotlib散点图图例显示问题修复

一、批量绘制策略(Strategy 1)的问题与修复

问题原因

scatter的legend_elements()方法仅支持基于数值型颜色映射的场景:即通过c传入数值数组,配合cmap生成颜色。你直接传入自定义颜色列表colors,且未提供可用于分组的数值标识,导致该方法无法生成图例所需的手柄(handles)和标签(labels),返回空列表。此外,label=labels的用法错误,scatter的label参数仅接受单个字符串,而非列表。

修复代码

通过给每个类别分配唯一数值,让颜色映射生效,再将自动生成的手柄与自定义标签绑定:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm

rng = np.random.default_rng(0)
x = rng.uniform(0, 3, 5)
y = rng.uniform(0, 5, 5)
labels = ["a", "b", "c", "d", "e"]
# 为每个类别分配唯一数值
label_indices = np.arange(len(labels))
cmap = cm.plasma

# 用数值作为颜色映射依据
scatter = plt.scatter(x=x, y=y, c=label_indices, cmap=cmap)
# 生成手柄后替换为自定义标签
handles, _ = scatter.legend_elements(num=label_indices)
plt.legend(handles, labels, loc="lower right")
plt.show()

二、循环绘制策略(Strategy 2)的问题与修复

问题原因

  1. 循环逻辑错误:仅按unique的索引取点,若labels存在重复值,会丢失部分数据;即使无重复,也未遵循按类别筛选数据的逻辑。
  2. 图例设置错误:label=str(unique)将整个类别列表转为字符串作为所有点的图例,无法区分单个类别。
  3. 参数冗余:使用color指定固定颜色时,cmap参数无效,属于多余设置。

修复代码

建立类别与颜色的映射,按类别筛选数据并单独绘制,为每个类别设置对应图例:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm

rng = np.random.default_rng(0)
x = rng.uniform(0, 3, 5)
y = rng.uniform(0, 5, 5)
labels = ["a", "b", "c", "d", "e"]
colors = [cm.plasma(i / float(len(labels))) for i in range(len(labels))]

plt.figure()
# 绑定类别与对应颜色
label_color_map = dict(zip(labels, colors))

for label in label_color_map:
    # 筛选当前类别的数据点
    mask = np.array(labels) == label
    plt.scatter(x[mask], y[mask], color=label_color_map[label], label=label)

plt.legend(loc="lower right")
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:23:15