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

