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

如何在seaborn figure-level绘图中指定调色板解决同色对应不同簇问题

Seaborn自定义调色板不生效解决方案

你的自定义调色板不生效,核心是参数传递位置错误:hue参数是在FacetGrid初始化时指定的,此时调色板规则由FacetGrid控制,你把palette传给内部的scatterplot不会生效。另外要实现不同切片的簇颜色完全对应,还需要固定hue_order,避免某类簇缺失时调色板自动重置顺序。

修改方法如下:

  1. 提前定义固定调色板和固定的hue取值顺序
  2. 初始化FacetGrid时传入palette和hue_order参数

修改后的代码示例:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame()
df['I'] = np.full(20,1)
df['J'] = np.arange(0,20,1)
df['K'] = [1]*12 + [2]*8
df['CM_Hard'] = [1]*10 + [2] + [0] + [2]*8 
df['Realization'] = ['p25']*10 + ['p50']*9 + ['p75']

# 提前定义固定调色板和hue顺序
palette = {0:"tab:cyan", 1:"tab:orange", 2:"tab:purple"}
hue_order = [0,1,2] # 固定所有切片的hue取值顺序,即使某类不存在也不会乱序

for layer in df['K'].unique():
    layer_data_slice = df.groupby('K').get_group(layer)

    # 把palette和hue_order传给FacetGrid
    g = sns.FacetGrid(layer_data_slice, col="Realization", hue="CM_Hard", 
                      palette=palette, hue_order=hue_order)
    # 内部scatterplot不需要再传palette
    g.map_dataframe(sns.scatterplot, x="I", y="J", s=50, marker='+')
    g.add_legend()

    g.fig.suptitle("Training Realizations, Layer: {}".format(int(layer)), size=16, y=1.05)
    figure_title = 'Training_Layer_{}'.format(int(layer))
    plt.show() # 按需保留用于显示图片

以上修改可以保证不同切片中同一个簇的颜色完全一致,即使某个切片中不存在某类簇,也不会出现颜色对应错位的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:57:03