在 Seaborn 中,我们还可以使用调色板来自定义自己喜欢的颜色风格。对于 Seaborn 来说,它提供的调色板主要包括以下 3 种。
- 分类调色板。
- 连续调色板。
- 发散调色板
Seaborn 分类调色板
分类调色板,主要用于区分没有固定顺序的离散数据,最常用于散点图、柱状图、直方图等中。在 Seaborn 中,我们可以使用 set_palette() 函数来使用分类调色板。
语法:
sns.set_palette(palette)说明:
参数 palette 是调色板主题,它的取值共有 6 种,如下表所示。
| 取值 | 说明 |
|---|---|
| deep | 深色系 |
| pastel | 浅色系 |
| dark | 暗色系 |
| bright | 亮色系 |
| muted | 哑色系 |
| colorblind | 色盲系 |
示例 1:Seaborn 使用分类调色板
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 定义调色板
sns.set_palette('deep')
# 加载内置数据集
df = sns.load_dataset('tips')
# 重命名列
column_map = {
'total_bill': '账单',
'tip': '小费',
'sex': '性别',
'smoker': '是否吸烟',
'day': '星期',
'time': '餐段',
'size': '人数'
}
df.rename(columns=column_map, inplace=True)
# 绘制图表
sns.barplot(data=df, x='星期', y='账单', hue='星期')
# 显示
plt.show()运行之后,效果如下图所示。

分析:
sns.set_palette('deep') 表示使用深色系的调色板。需要注意的是,调色板必须在绘图函数之前进行设置,否则可能就会有问题。此外对于这个例子来说,下面 2 种方式是等价的。
# 方式 1
sns.set_palette('deep')
# 方式 2
sns.set_palette(palette='deep')当我们使用 sns.set_palette('pastel') 时,此时效果如下图所示。

当我们使用 sns.set_palette('dark') 时,此时效果如下图所示。

当我们使用 sns.set_palette('bright') 时,此时效果如下图所示。

当我们使用 sns.set_palette('muted') 时,此时效果如下图所示。

当我们使用 sns.set_palette('colorblind') 时,此时效果如下图所示。

Seaborn 连续调色板
连续调色板,主要用于区分连续型的数据(即需要区分大小),最常用于热力图等中。在 Seaborn 中,我们可以使用 light_palette() 或 dark_palette() 这两个函数来使用连续调色板。
其中,light_palette() 函数使用是 “浅色系” 的连续调色板,而 dark_palette() 使用的是 “深色系” 的连续调色板。
语法:
sns.light_palette(color, reverse)
sns.dark_palette(color, reverse)说明:
参数 color 用于定义基础颜色,它的取值可以是关键字(如 'red'),也可以是十六进制 RGB 值(如 '#FFFF00')。
参数 reverse 用于定义颜色是否反向显示,默认值为 False(也就是不反向)。
示例 2:使用 light_palette()
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 定义调色板
palette = sns.light_palette('skyblue')
# 加载数据
df = sns.load_dataset('flights')
# 重命名列
df.rename(columns={'year': '年份', 'month': '月份', 'passengers': '人数'}, inplace=True)
# 调整行列(透视表)
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=False)
# 绘制图表
sns.heatmap(data=df, cmap=palette)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
如果想要针对热力图使用连续调色板,首先 sns.light_palette() 会返回一个值,然后我们需要在 heatmap() 函数中将 cmap 这个参数的值设置为该返回值,这样才会生效。
对于这个例子来说,下面 2 种方式是等价的。
# 方式 1
palette = sns.light_palette('skyblue')
# 方式 2
palette = sns.light_palette(color='skyblue')我们还可以使用 reverse=True 这个参数来将连续调色板的颜色反向显示。修改后的代码如下,此时效果如下图所示。
palette = sns.light_palette('skyblue', reverse=True)

示例 3:使用 dark_palette()
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 定义调色板
palette = sns.dark_palette('skyblue')
# 加载数据
df = sns.load_dataset('flights')
# 重命名列
df.rename(columns={'year': '年份', 'month': '月份', 'passengers': '人数'}, inplace=True)
# 调整行列(透视表)
df = df.pivot_table(index='年份', columns='月份', values='人数', observed=False)
# 绘制图表
sns.heatmap(data=df, cmap=palette)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
同样地,我们可以使用 reverse=True 这个参数来将连续调色板的颜色反向显示。修改后的代码如下,此时效果如下图所示。
palette = sns.dark_palette('skyblue', reverse=True)

Seaborn 发散调色板
发散调色板,主要用于区分具有 “中间值”(通常是 0)的数据。数据从中间向两端发散,两端颜色越深代表数值的绝对值越大。这种调色板最常用于展示相关性热力图、差异分析等场景。
在 Seaborn 中,我们可以使用 diverging_palette() 函数来构建发散调色板。
语法:
sns.diverging_palette(h_neg, h_pos, as_cmap)说明:
diverging_palette() 函数可以接收很多参数,主要的如下表所示。
| 参数 | 说明 |
|---|---|
| h_neg | 负值(左侧)的色相(Hue),取值 0 ~ 360 |
| h_pos | 正值(右侧)的色相(Hue),取值 0 ~ 360 |
| s | 饱和度(Saturation),默认 75 |
| l | 亮度(Lightness),默认 50 |
| center | 中心颜色,可选:'light'(默认)或 'dark' |
| as_cmap | 是否返回 Matplotlib 的 colormap,热力图中需设为 True |
示例 4:使用发散调色板
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 数据:生成一个 10x10 的随机矩阵,包含正负数
data = np.random.randn(10, 10)
# 定义发散调色板(蓝色-红色)
# 240 是蓝色的色相,10 是红色的色相
palette = sns.diverging_palette(240, 10, as_cmap=True)
# 绘制图表
# center=0 确保数据的 0 值对应调色板的中心颜色(白色)
sns.heatmap(data=data, cmap=palette, center=0)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
sns.diverging_palette(240, 10, as_cmap=True) 表示生成一个从蓝色(240)过渡到白色、再过渡到红色(10)的调色板。在 heatmap() 中设置 center=0 是非常关键的一步,它保证了数据中的 0 值准确地对应到调色板的白色区域,从而让我们一眼就能看出数据的正负分布。
示例 5:自定义色相与饱和度
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置
sns.set_theme(rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False})
# 数据
data = np.random.randn(10, 10)
# 定义发散调色板(紫色-绿色)
# 275 是紫色的色相,150 是绿色的色相
# s=80 提高饱和度,l=55 稍微提高亮度
palette = sns.diverging_palette(275, 150, s=80, l=55, as_cmap=True)
# 绘制图表
sns.heatmap(data=data, cmap=palette, center=0)
# 显示
plt.show()运行之后,效果如下图所示。

分析:
通过调整 h_neg 和 h_pos 参数,我们可以轻松定制符合自己审美的发散调色板。小伙伴们可以参考标准的色轮(Color Wheel)来选择互补色作为两端的色相。
