Seaborn 调色板

在 Seaborn 中,我们还可以使用调色板来自定义自己喜欢的颜色风格。对于 Seaborn 来说,它提供的调色板主要包括以下 3 种。

  • 分类调色板。
  • 连续调色板。
  • 发散调色板

Seaborn 分类调色板

分类调色板,主要用于区分没有固定顺序的离散数据,最常用于散点图柱状图直方图等中。在 Seaborn 中,我们可以使用 set_palette() 函数来使用分类调色板。

语法:

sns.set_palette(palette)

说明:

参数 palette 是调色板主题,它的取值共有 6 种,如下表所示。

参数 palette 的取值
取值 说明
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()

运行之后,效果如下图所示。

Seaborn 使用深色系(deep)调色板

分析:

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

# 方式 1
sns.set_palette('deep')

# 方式 2
sns.set_palette(palette='deep')

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

Seaborn 使用浅色系(pastel)调色板

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

Seaborn 使用暗色系(dark)

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

Seaborn 使用亮色系(bright)

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

Seaborn 使用哑色系(muted)

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

Seaborn 使用色盲系(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()

运行之后,效果如下图所示。

Seaborn 使用 light_palette()

分析:

如果想要针对热力图使用连续调色板,首先 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)

seaborn light_palette() 反向显示

示例 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()

运行之后,效果如下图所示。

Seaborn 使用 dark_palette()

分析:

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

palette = sns.dark_palette('skyblue', reverse=True)

Seaborn dark_palette() 反向显示

Seaborn 发散调色板

发散调色板,主要用于区分具有 “中间值”(通常是 0)的数据。数据从中间向两端发散,两端颜色越深代表数值的绝对值越大。这种调色板最常用于展示相关性热力图、差异分析等场景。

在 Seaborn 中,我们可以使用 diverging_palette() 函数来构建发散调色板。

语法:

sns.diverging_palette(h_neg, h_pos, as_cmap)

说明:

diverging_palette() 函数可以接收很多参数,主要的如下表所示。

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()

运行之后,效果如下图所示。

Seaborn 使用发散调色板

分析:

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()

运行之后,效果如下图所示。

Seaborn 发散调色板自定义色相与饱和度

分析:

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

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号