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)的问题与修复
问题原因
- 循环逻辑错误:仅按
unique的索引取点,若labels存在重复值,会丢失部分数据;即使无重复,也未遵循按类别筛选数据的逻辑。 - 图例设置错误:
label=str(unique)将整个类别列表转为字符串作为所有点的图例,无法区分单个类别。 - 参数冗余:使用
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
相关产品推荐
相关产品推荐

