如何在 seaborn 图形级图中指定调色板

How to specify the palette in a seaborn figure-level plot

如果我需要进行特定更改或面向细节的可视化,我已经学会了不使用 seaborn,但我觉得我有时没有充分利用它所提供的功能。

我想专门为 seaborn 指定调色板。我不确定我是否只是遗漏了什么,或者这是使用 facetgrid 时无法解决的细节?

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']

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

    g = sns.FacetGrid(layer_data_slice, col="Realization",hue="CM_Hard")
    g.map_dataframe(sns.scatterplot, x="I", y="J", s=50, marker='+', palette='deep')
    g.add_legend()

    g.fig.suptitle("Training Realizations, Layer: {}".format(int(layer)), size=16, y=1.05)
    figure_title = 'Training_Layer_{}'.format(int(layer))

我尝试将以下内容用于调色板定义,但它不会影响绘图:

palette = {0:"tab:cyan", 1:"tab:orange", 2:"tab:purple"}

已尝试使用“tab:color”、“color”和 RGB 参考,但没有成功。没有错误,它在更改时根本不执行任何操作。

  • 更新至 seaborn 0.11.2。使用 FacetGrid directly is not recommended. Use seaborn.relplotkind='scatter' 绘制 figure-level 图。
  • palette 中的 keys 必须与传递给 hue.
  • 的列中的唯一值匹配
  • python 3.8.12pandas 1.3.4matplotlib 3.4.3seaborn 0.11.2
  • 中测试
import seaborn as sns

# load the data - this is a pandas.DataFrame
tips = sns.load_dataset('tips')

# set the hue palette as a dict for custom mapping
palette = {'Lunch': "tab:cyan", 'Dinner':"tab:purple"}

# plot
p = sns.relplot(kind='scatter', data=tips, col='smoker', x='total_bill', y='tip', hue='time', palette=palette)

  • 使用添加到 OP 的新样本数据
  • 如果 'K' 列重命名为 'Layer',则子图标题将与您的示例匹配:df = df.rename({'K': 'Layer'}, axis=1)
p = sns.relplot(data=df, x='I', y='J', s=50, marker='+', row='Layer', col='Realization', hue='CM_Hard', palette=palette, height=4)
p.fig.suptitle('Training Realizations', y=1.05, size=16)

FacetGrid

  • 请注意 paletteFacetGrid 调用中,而不是 map_dataframe
for layer in df['K'].unique():
    layer_data_slice = df.groupby('K').get_group(layer)

    g = sns.FacetGrid(layer_data_slice, col="Realization",hue="CM_Hard", palette=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))