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

Seaborn多图中实现同类别统一配色的方法

Seaborn子图类别颜色统一与配色调整方案

问题背景

在包含两个子图的Seaborn图表中,同一类别(如A)在上下子图颜色不一致:上方子图A为橙色,下方子图A为蓝色。需要实现:

  • A、B等类别在所有子图中颜色统一
  • 使用Seaborn主题自带的固定配色序列(蓝、橙、绿…),不手动指定颜色名称/十六进制值
  • 了解如何获取该配色序列,以及能否调整单个子图的配色顺序

获取Seaborn主题配色序列

Seaborn默认配色序列可以通过sns.color_palette()直接获取,默认序列顺序为蓝、橙、绿、红、紫、棕、粉…。如果需要指定风格(如deep、bright),可传入对应参数:

# 获取当前主题默认配色序列
default_palette = sns.color_palette()
# 获取指定风格的配色序列
deep_palette = sns.color_palette("deep")

# 输出配色的十六进制值,查看具体颜色
print(default_palette)

实现子图颜色统一

核心是给所有类别建立固定的颜色映射关系,再将这个映射传给每个子图的palette参数,让Seaborn按映射分配颜色,而非按子图内的类别顺序自动分配。

修改后的完整代码:

#!/usr/bin/env python3
import random
import pandas
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme()

random.seed(0)

df = pandas.DataFrame({
    'Group': random.choices(['A', 'B'], k=200),
    'Vals': random.choices(range(200), k=200)
})

a_and_b = df.copy()
a_and_b.Group = 'All'
df = pandas.concat([df, a_and_b])

# 定义所有类别,并绑定到配色序列的对应位置
all_groups = ['All', 'A', 'B']
palette = sns.color_palette()
color_mapping = {group: palette[i] for i, group in enumerate(all_groups)}

fig, axes = plt.subplots(nrows=2, ncols=1)

# 第一个子图:使用统一颜色映射
sns.boxplot(
    ax=axes[0],
    data=df,
    y='Vals',
    x='Group',
    order=['All', 'A', 'B'],
    palette=color_mapping
)

# 第二个子图:同样使用统一颜色映射
sns.boxplot(
    ax=axes[1],
    data=df.loc[df.Group.ne('All')],
    y='Vals',
    x='Group',
    order=['A', 'B'],
    palette=color_mapping
)

plt.show()

调整单个子图的配色顺序

如果需要让某个子图的类别使用配色序列中特定位置的颜色(比如第二个子图的A用序列第2个颜色,B用第3个),可以单独为该子图创建自定义颜色映射:

# 针对第二个子图的自定义配色映射
custom_palette = {
    'A': palette[1],  # 配色序列中第2个颜色(索引从0开始)
    'B': palette[2]   # 配色序列中第3个颜色
}

# 第二个子图使用自定义映射
sns.boxplot(
    ax=axes[1],
    data=df.loc[df.Group.ne('All')],
    y='Vals',
    x='Group',
    order=['A', 'B'],
    palette=custom_palette
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:50:39