如何在Matplotlib散点图中正确关联数据标签与颜色编码
解决Matplotlib散点图标签与数据的正确关联问题
核心思路
直接固定颜色映射规则和图例的取值对应顺序,避免Matplotlib自动按数据出现顺序分配标签。具体做两点调整:
- 自定义颜色映射,让0对应蓝色、1对应红色
- 生成图例元素时强制指定取值顺序,确保标签和color_code的取值严格对应
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap BT1=np.random.uniform(180,300,size=[1,100]) #x BT2=np.random.uniform(180,300,size=[1,100]) #y color_code=np.random.choice([0,1],size=[1,100]) #color code # 手动指定颜色映射:0→蓝色,1→红色 cmap = ListedColormap(['blue', 'red']) fig,ax=plt.subplots() # 固定颜色映射的取值范围,确保0和1始终对应指定颜色 scatter=ax.scatter(BT1, BT2, c=color_code, cmap=cmap, vmin=0, vmax=1) # 生成图例时强制指定取值顺序为[0,1],匹配后续的标签 legend_handles = scatter.legend_elements(num=2, values=[0,1])[0] ax.legend(handles=legend_handles, labels=["Clear","Cloudy"], title="Cloud Mask") ax.set_xlabel("TIR1 sample BT") ax.set_ylabel("TIR2 sample BT") plt.show()
关键细节说明
vmin=0, vmax=1:锁定颜色映射的取值范围,不管color_code里0和1谁先出现,颜色对应关系都不会变values=[0,1]:强制legend_elements()按0、1的顺序生成图例手柄,这样后续的["Clear","Cloudy"]标签就能精准对应0和1- 也可以用内置colormap替代手动指定:比如
cmap = plt.cm.get_cmap('coolwarm', 2),但手动指定颜色更直观符合需求
之前方法无效的原因
你之前修改图例手柄颜色的代码,问题出在传入labels=["Clear","Cloudy"]后,图例手柄的标签已经被替换成了"Clear"和"Cloudy",不再是"0"和"1",所以hl_dict['0']找不到对应的手柄,自然无法生效。
内容的提问来源于stack exchange,提问作者Pixel_Bear
相关产品推荐
相关产品推荐

