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

如何在Matplotlib散点图中正确关联数据标签与颜色编码

解决Matplotlib散点图标签与数据的正确关联问题

核心思路

直接固定颜色映射规则和图例的取值对应顺序,避免Matplotlib自动按数据出现顺序分配标签。具体做两点调整:

  1. 自定义颜色映射,让0对应蓝色、1对应红色
  2. 生成图例元素时强制指定取值顺序,确保标签和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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:20:20