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

如何在Seaborn/Matplotlib循环绘图中固定Hue颜色映射?

问题

我在for循环中绘制多个散点图,hue依据一个仅取0或1值的维度设置。为此我定义了仅含两种颜色的调色板:

colors = ["#6e0303", "#2d659c"]
sns.set_palette(sns.color_palette(colors))

但循环绘图时,部分图中1对应的是一种颜色,其余图中1对应的是另一种颜色。我希望固定颜色映射:1 -> "#6e0303",0 -> "#2d659c"。循环内调用的代码如下:

plt.figure()
sns.scatterplot(data=df, x="x_col", y="y_col", hue="my_dimension")

请问有实现方法吗?

解决方案

直接用sns.scatterplot的palette参数指定字典形式的固定映射,就能彻底解决颜色对应混乱的问题:

# 定义固定的颜色映射字典,明确指定每个值对应的颜色
color_map = {1: "#6e0303", 0: "#2d659c"}

# 循环绘图时直接传入这个字典
plt.figure()
sns.scatterplot(data=df, x="x_col", y="y_col", hue="my_dimension", palette=color_map)

之前全局设置调色板会乱,是因为seaborn会根据当前子图中hue列的取值出现顺序分配颜色——如果有的子图里先出现0,有的先出现1,颜色对应就会颠倒。用字典明确绑定每个值和颜色,就能强制固定对应关系,不受取值顺序影响。

如果习惯用全局调色板的方式,也可以先把my_dimension列转换成有序分类类型,固定它的取值顺序:

import pandas as pd

# 把维度列设置为有序分类,指定顺序是[0,1]
df["my_dimension"] = pd.Categorical(df["my_dimension"], categories=[0, 1], ordered=True)

# 这里的调色板顺序要和分类顺序对应:第一个颜色对应0,第二个对应1
colors = ["#2d659c", "#6e0303"]
sns.set_palette(sns.color_palette(colors))

# 之后循环绘图,颜色映射就固定了
plt.figure()
sns.scatterplot(data=df, x="x_col", y="y_col", hue="my_dimension")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:10:09