Matplotlib散点图图例显示异常:标签数不符、颜色映射错误问题
问题原因
两个异常的核心诱因是scatter.legend_elements()方法的默认逻辑:
- 该方法默认将传入的颜色映射视为连续值,自动做等分采样生成图例项,
num参数为默认值'auto'时最多返回10个条目,不会匹配你实际的19个离散类别,直接导致图例标签数量缺失。 - 默认采样逻辑是按色条范围等距取色,返回的图例手柄和你传入的19个
pitch唯一值不存在一一对应关系,强行配对就会出现颜色和标签错位,比如标签'15'匹配不到预设的深蓝色。
修复方法
调用legend_elements()时显式指定num=len(u),强制方法生成和离散类别数量完全一致的图例手柄,即可保证标签数量完整、颜色和值一一对应。
修正后的可运行代码:
import pandas as pd import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap import matplotlib.colors as colors import matplotlib.cm as cm import numpy as np df = pd.DataFrame({ "X" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37], "Y" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37], "pitch":[10,10,20,20,30,40,50,50,60,60,60,70,70,70,70,80,80,80,100,150,1,2,3,4,5,6,7,8,9,10,3,4,5,8,9,10,3], }) color = cm.jet u, div = np.unique(df.pitch.values, return_inverse=True) colorlist = [colors.rgb2hex(color(i)) for i in np.linspace(1, 0, len(u))] cmap = ListedColormap(colorlist) fig,ax = plt.subplots(figsize=(10,8)) scatter = plt.scatter(df['X'],df['Y'], c=div, cmap=cmap) # 关键修改:指定生成和类别数等量的图例项 plt.legend(*scatter.legend_elements(num=len(u)), labels=u, loc=2) plt.show()
原错误代码运行效果:
内容的提问来源于stack exchange,提问作者Brian Kim
相关产品推荐
相关产品推荐


