如何在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
相关产品推荐
相关产品推荐

