探索 Seaborn Palette 的奥秘:为数据可视化增色添彩

一、引言


在数据科学的世界里,视觉传达是不可或缺的一环。一个好的数据可视化不仅能传递信息,还能引发共鸣。Seaborn 是 Python 中一款广受欢迎的可视化库,而它的调色板(palette)功能,则为我们提供了调配绚丽图表的强大工具。

为了直观展示 Seaborn palette ,我们先用几幅图像展示 seaborn 内置的几种色彩。

def draw_colorful_plots():
    # 示例数据
    data = np.linspace(0, 2 * np.pi, 100) * 3
    inc = [np.linspace(0, i * np.pi, 100) for i in range(1, 7)]
    data = np.sin(data) + np.asarray(inc)
    data = data.T
    
	# 系统内置的调色板
    palettes = ['deep', 'pastel', 'dark', 'muted', 'bright', 'colorblind']

    fig, axes = plt.subplots(2, 3, figsize=(10, 5), sharey=True)
    for ax, palette in zip(axes.flatten(), palettes):
        sns.lineplot(data=data, palette=palette, ax=ax) # 通过palette指定当前绘图选择的调色板
        ax.set_title(f'Palette: {palette}')
        ax.legend(ncol=2)	# 修改图例为两列,使其排版更加合理
    plt.tight_layout()
    plt.show()

draw_colorful_plots()

在这里插入图片描述

上述代码生成了六张使用不同调色板的曲线图,每种调色板都展现了 Seaborn 对颜色设计的独特理解。官方对这 6 种内置的颜色方案也给出了解释:

上图中横坐标为饱和度(saturation),纵坐标为亮度(luminance),根据饱和度和亮度变化从而产生了 6 种内置的调色方案,其名称标注在图上,可以根据个人喜好进行选择。

二、seaborn的调色板palette


1. 什么是 Seaborn 的调色板?

调色板 palette 是 Seaborn 提供的一组预定义或自定义的颜色集合。总的来说,Seaborn 中的调色板可以分为离散颜色和连续颜色两个大类,默认情况下,对于类别型变量(例如性别,星期)等,Seaborn 会使用离散颜色系统,而对于连续型变量(例如温度,身高)等,Seaborn 会选择连续颜色系统。

本质上,离散型颜色系统和连续型颜色系统没有区别。离散型颜色从颜色空间抽样数量较少,而连续型颜色从颜色空间抽样数量较多,仅此而已。我们可以通过阅读seaborn的源码得知:

def husl_palette(n_colors=6, h=.01, s=.9, l=.65, as_cmap=False):  # noqa
    """
    Return hues with constant lightness and saturation in the HUSL system.

    as_cmap : bool
        If True, return a matplotlib colormap object.
    """
    if as_cmap:
        n_colors = 256
  	# ... 省略了中间的代码
    if as_cmap:
        return mpl.colors.ListedColormap(palette, "hsl")
    else:
        return _ColorPalette(palette)

对于连续颜色系统,一般会设定参数 as_cmap=True,从上面代码可以看到,当指定as_cmap=True时,n_colors被赋值为256,而对于离散颜色系统,我们一般只会选择 6、10、20 这些数字(调色板 tab10 中的数字10就表示10个离散颜色)。总之,在计算机系统中,我们无法真正做到连续颜色,大部分的连续颜色都只是将颜色切分为256个级别,使其看起来比离散颜色更加细腻而已。

所以,seaborn 中总共包含两种颜色系统:

  • 离散颜色调色板:适用于类别变量,直接使用 sns.color_palette() 创建,比如使用 "Set2""Paired" 等;
  • 连续颜色调色板:适用于数值变量,用于表示连续的颜色变化,一般需要修改参数as_cmap=True

2. 如何选择和使用调色板?

2.1 内置调色板

Seaborn 提供了一组精心设计的默认调色板,在绘图过程中可以通过指定 palette 参数为某个内置调色板的名称(字符串)即可,例如 palette=deep

可以通过如下API查看 seaborn 内置的默认调色板类型:

sns.palettes.SEABORN_PALETTES.keys()

# 返回值:数字6表示6种离散的颜色
dict_keys(['deep', 'deep6', 'muted', 'muted6', 'pastel', 'pastel6', 'bright', 'bright6', 'dark', 'dark6', 'colorblind', 'colorblind6'])

除了 seaborn 内置的调色板,Matplotlib 也有内置的调色板,可以通过如下代码:

sns.palettes.MPL_QUAL_PALS.keys()

# 返回值:其中的数字有些是表示离散颜色的个数,比如tab10,tab20都是表示颜色个数,而Set1和Set2等不是表示离散颜色个数
dict_keys(['tab10', 'tab20', 'tab20b', 'tab20c', 'Set1', 'Set2', 'Set3', 'Accent', 'Paired', 'Pastel1', 'Pastel2', 'Dark2'])

我们可以借助sns.palplot函数来可视化调色板,从而选择合适的颜色:

colors = sns.color_palette("deep")
sns.palplot(colors)	# 一个专门用于可视化调色板的工具函数
plt.title("Deep Palette")
plt.gcf().set_figheight(2.0)
plt.gcf().set_figwidth(10)
plt.savefig('imgs/palette_deep.svg')
plt.tight_layout()
plt.show()

在这里插入图片描述

2.2 离散调色板

离散调色板主要用于分类数据。我们可以通过 sns.color_palette()sns.set_palette() 应用

# 使用"Set2"调色板
colors = sns.color_palette("Set2")
sns.palplot(colors)
plt.gcf().set_figheight(2.0)
plt.gcf().set_figwidth(10)
plt.title("Set2 Palette")
plt.savefig('./imgs/palette_set2.svg')
plt.show()

在这里插入图片描述

2.3 连续调色板

连续调色板非常适合展示细腻的颜色变化的数据,比如热图:

plt.figure(figsize=(4, 3))  # 设置图像大小
data = np.sin(np.linspace(0, 2 * np.pi, 40000) * 3).reshape(200, 200)
sns.heatmap(data, cmap=sns.color_palette('rocket', as_cmap=True), xticklabels=False, yticklabels=False)
plt.savefig('./imgs/continuous_palette.svg')
plt.show()

在这里插入图片描述

可以使用如下方法来查看系统中可以使用的连续系统颜色类型

from matplotlib import colormaps

print(list(colormaps))
['magma', 'inferno', 'plasma', 'viridis', 'cividis', 'twilight', 'twilight_shifted', 'turbo', 'Blues', ...]
2.4 自定义调色板

Seaborn 提供了灵活的工具来创建和使用自定义调色板,以满足特定的数据可视化需求。以下是几种常见的方式来创建自定义调色板:

1. 直接定义颜色列表

如果你已经有一组特定的颜色值,可以直接将它们传递给 sns.color_palette() 方法。颜色值可以是十六进制代码、RGB 元组或 Matplotlib 支持的颜色名称。

import seaborn as sns
import matplotlib.pyplot as plt

# 定义自定义颜色列表
custom_palette = ['#FF5733', '#33FF57', '#3357FF', '#FFFF33']

# 使用自定义调色板
sns.set_palette(custom_palette)
sns.palplot(sns.color_palette())  # 可视化调色板
plt.show()

在这里插入图片描述

2. 使用 sns.light_palette()sns.dark_palette()

Seaborn 提供了两个专门的方法来创建基于单一颜色的浅色调或深色调渐变调色板。

# 创建浅色调调色板
light_palette = sns.light_palette("#FF5733", as_cmap=False)

# 创建深色调调色板
dark_palette = sns.dark_palette("#FF5733", as_cmap=False)

# 可视化浅色调和深色调调色板
sns.palplot(light_palette)
plt.savefig('./imgs/custom_light.svg')
sns.palplot(dark_palette)
plt.savefig('./imgs/custom_dark.svg')
plt.show()

在这里插入图片描述

在这里插入图片描述

3. 使用 sns.blend_palette() 混合多种颜色

如果想要结合多种颜色形成复杂的渐变,可以使用 sns.blend_palette() 方法。这适合需要展示多阶段数据变化的场景。

# 混合多种颜色
blend_palette = sns.blend_palette(['#FF5733', '#33FF57', '#3357FF'], n_colors=10)

# 可视化混合调色板
sns.palplot(blend_palette)
plt.show()

在这里插入图片描述

4. 生成循环调色板

在某些场景下(如分类变量较多时),需要循环的调色板。Seaborn 的 sns.color_palette() 支持生成离散的循环调色板。

# 创建循环调色板
circular_palette = sns.color_palette("husl", 8)

# 可视化循环调色板
sns.palplot(circular_palette)
plt.savefig('./imgs/circular_palette.svg')
plt.show()

在这里插入图片描述

上面代码中sns.color_palette('husl', 8)中的husl参数会在底层调用sns.husl_palette函数创建对应的调色板,husl的全称是 Human-friendly HSL, 是一种人类友好的HSL的颜色系统(HSL颜色系统介绍见下文),更加底层的是API函数是sns.hsl_palette

pal = sns.hls_palette(n_colors=6, h=.7, l=.3, s=.8) # h l s三个参数分别指定色调、亮度、饱和度
sns.palplot(pal)
plt.savefig('./imgs/hls_palette.svg')
plt.show()

在这里插入图片描述

pal = sns.husl_palette(n_colors=6, h=.7, l=.3, s=.8) # h l s三个参数分别指定色调、亮度、饱和度
sns.palplot(pal)
plt.savefig('./imgs/husl_palette.svg')
plt.show()

在这里插入图片描述

5. seaborn 特色风格的调色板

crayon_palettexkcd_palette Seaborn 提供的两种特定方法,分别用来创建具有蜡笔(crayon)颜色风格的调色板以及 xkcd 颜色调查 的调色板。

xkcd 是一个知名的网络漫画网站,在一次调查中,该网站的作者向社区征集了用户对颜色名称的认知,并将结果整理成了一份包含 954 种颜色的名称和对应 RGB 值的列表。这些颜色以直观、通俗的名称命名,比如 xkcd:sky blue(天蓝色)和 xkcd:grass green(草绿色)。

# 定义蜡笔风格的调色板
crayon_palette = ['Almond', 'Apricot', 'Beaver', 'Black']

# 设置调色板
palette = sns.crayon_palette(crayon_palette)

# 可视化调色板
sns.palplot(palette)
plt.savefig('./imgs/crayon_palette.svg')
plt.show()

在这里插入图片描述

需要注意的是,crayon的颜色不是随意选择的,而需要通过特定颜色进行组合,可以通过如下函数查看:

list(sns.colors.crayons.keys())[:10]

['Almond',
 'Antique Brass',
 'Apricot',
 'Aquamarine',
 'Asparagus',
 'Atomic Tangerine',
 'Banana Mania',
 'Beaver',
 'Bittersweet',
 'Black']

同样地,我们可以定义xkcd风格的调色板:

# 定义xkcd风格的调色板
xkcd_palette = ['acid green', 'adobe', 'algae', 'algae green']

# 设置调色板
palette = sns.xkcd_palette(xkcd_palette)

# 可视化调色板
sns.palplot(palette)
plt.savefig('./imgs/xkcd_palette.svg')
plt.show()

其中,xkcd的风格的输入颜色也有类似的限制,可以通过如下函数查看:

list(sns.colors.xkcd_rgb.keys())[:10]

['acid green',
 'adobe',
 'algae',
 'algae green',
 'almost black',
 'amber',
 'amethyst',
 'apple',
 'apple green',
 'apricot']
6. 使用 cubehelix_palette 生成色盲友好的调色板
sns.palplot(sns.cubehelix_palette(start=0.5, rot=-0.75, n_colors=6))
plt.savefig('./imgs/cubehelix_palette.svg')
plt.show()

在这里插入图片描述

7. 使用sns.diverging_palette生成两个“极端”颜色

这里的“极端”的意思是两个极点,类似于正负区间的那种,中间会横跨原点,从一个极端到另一个极端,而不是前面介绍的light或者dark那样单个色调的明暗变化。

seaborn中内置有两个diverging调色板:vlagicefire

sns.color_palette("vlag", as_cmap=True)import matplotlib.ticker as ticker


_, ax = plt.subplots(1, 1, figsize=(6, 1))
pal = sns.color_palette("vlag", as_cmap=True)
n = 256
ax.imshow(np.arange(n).reshape(1, n),
            cmap=pal,
            interpolation="nearest", aspect="auto")
ax.set_xticks(np.arange(n) - .5)
ax.set_yticks([-.5, .5])
# Ensure nice border between colors
ax.set_xticklabels(["" for _ in range(n)])
# The proper way to set no ticks
ax.yaxis.set_major_locator(ticker.NullLocator())
plt.savefig('./imgs/diverging_vlag.svg')
plt.show()

在这里插入图片描述

import matplotlib.ticker as ticker


_, ax = plt.subplots(1, 1, figsize=(6, 1))
pal = sns.color_palette("icefire", as_cmap=True)
n = 256
ax.imshow(np.arange(n).reshape(1, n),
            cmap=pal,
            interpolation="nearest", aspect="auto")
ax.set_xticks(np.arange(n) - .5)
ax.set_yticks([-.5, .5])
# Ensure nice border between colors
ax.set_xticklabels(["" for _ in range(n)])
# The proper way to set no ticks
ax.yaxis.set_major_locator(ticker.NullLocator())
plt.savefig('./imgs/diverging_icefire.svg')
plt.show()

在这里插入图片描述

更进一步,我们可以自定义想要的diverging 颜色:

import matplotlib.ticker as ticker


_, ax = plt.subplots(1, 1, figsize=(6, 1))
pal = sns.diverging_palette(h_neg=145, h_pos=300, s=75, l=50, sep=10,center='light', as_cmap=True)
n = 256
ax.imshow(np.arange(n).reshape(1, n),
            cmap=pal,
            interpolation="nearest", aspect="auto")
ax.set_xticks(np.arange(n) - .5)
ax.set_yticks([-.5, .5])
# Ensure nice border between colors
ax.set_xticklabels(["" for _ in range(n)])
# The proper way to set no ticks
ax.yaxis.set_major_locator(ticker.NullLocator())
plt.savefig('./imgs/custom_diverging.svg')
plt.show()

h_neg, h_pos分别是色调的起始和结束值,s和l分别是饱和度和亮度,center决定中心是亮还是暗

在这里插入图片描述

三、颜色的基础知识

由于我们眼睛的工作原理,特定的颜色可以通过三个基本组件来定义。我们通常在计算机中通过指定 RGB 值来编程颜色,这些值设定了显示器中红色、绿色和蓝色通道的强度。但是对于分析颜色的感知属性来说,使用色相、饱和度和亮度通道俩表示则更合适。

HSL 颜色空间,即色相(Hue)、饱和度(Saturation)和亮度(Lightness),是一种用于描述颜色的系统。以下是对HSL 颜色空间的详细解释:

  1. 色相(Hue):色相是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。它表示在光谱中的位置,用角度度量,取值范围为0~360°。例如,0°表示红色,120°表示绿色,240°表示蓝色等。

  2. 饱和度(Saturation):饱和度是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。它表示颜色接近光谱色的程度。饱和度越高,说明颜色越深,越接近光谱色;饱和度越低,说明颜色越浅,越接近白色。饱和度为0时,表示纯白色。

  3. 亮度(Lightness):亮度表示颜色的明暗程度,取0-100%的数值。在HSL颜色空间中,亮度为100%表示白色,亮度为0表示黑色。亮度决定了颜色空间中颜色的明暗程度,亮度越高,颜色越明亮。

HSL 颜色空间与 RGB 颜色空间相比,更接近人们对彩色的感知经验,因此更加直观。在图像处理中,使用 HSL 颜色空间可以更方便地进行颜色的对比和调整。此外,由于 HSL 颜色空间中的亮度分量独立于色相和饱和度,因此在提取白色物体时,使用 HSL 颜色空间比 HSV 颜色空间更准确。

总的来说,HSL颜色空间是一种用于描述颜色的系统,通过色相、饱和度和亮度三个分量来定义颜色。它在图像处理和计算机视觉等领域具有广泛的应用。

四、总结


Seaborn 的调色板功能为数据可视化注入了无尽的创意与美感。从内置的经典色彩到自定义的高级调色,palette 是将数据视觉化艺术与科学结合的重要工具。希望这篇博客能激发你对调色板的探索热情,为你的图表增色添彩。

五、参考资料

  1. Seaborn Choosing color palettes
  2. Matplotlib Colormaps
  3. CSDN Matplotlib Colormaps

六、推荐阅读

  • 掌控数据间的关系:sns.scatterplot 教你绘制高颜值散点图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/940160.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导 Sigrity System Explorer Snip Via Pattern From Layout模式支持从其它设计中截取过孔模型用于仿真分析,同样以差分模板为例 具体操作如下 双击打开System Explorer软件…

数据分析实战—玻璃类别分类

1.实战内容 (1) 加载玻璃类别数据集,划分训练集、测试集 import pandas as pd import numpy as np pd.set_option(display.max_columns, None) pd.set_option(display.max_rows, None) # 读取数据集 glass pd.read_csv(glass.csv, encodinggbk, headerNone) glas…

Hive是什么,Hive介绍

官方网站:Apache Hive Hive是一个基于Hadoop的数据仓库工具,主要用于处理和查询存储在HDSF上的大规模数据‌。Hive通过将结构化的数据文件映射为数据库表,并提供类SQL的查询功能,使得用户可以使用SQL语句来执行复杂的​MapReduce任…

GIN

gin是什么 Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API,但性能比 Martini 快 40 倍。如果你需要极好的性能,使用 Gin 吧。 特点:gin是golang的net/http库封装的web框架,api友好,注…

初始Python篇(13)—— 模块以及Python中常用的内置模块

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-CSDN博客 所属专栏: Python 目录 模块的概念 模块的导入 包的概念以及使用 主程序运行 Python中常用的内置模块 random模块 time模块 datetime模块 …

时间序列异常值检测方法

文章目录 一、基于统计的方法1.1、标准差1.2、箱线图1.3、Z-Score法 二、基于机器学习算法的方法2.1、K-NN2.2、孤立森林 三、基于密度的方法3.1、LOF3.2、DBSCAN密度聚类 时间序列相关参考文章: 时间序列预测算法—ARIMA 时间序列预测算法—Prophet 时间序列分类任…

8K+Red+Raw+ProRes422分享5个影视级视频素材网站

Hello,大家好,我是后期圈! 在视频创作中,电影级的视频素材能够为作品增添专业质感,让画面更具冲击力。无论是广告、电影短片,还是品牌宣传,高质量的视频素材都是不可或缺的资源。然而&#xff…

顺序表的操作

注意位序和数组下标的关系 插入: 插入的时间复杂度: 最深层语句: 最好情况 最坏情况 平均情况 删除: 查找:

五、windows上vscode构建c/c++环境

1、安装vscode 官网下载界面:https://code.visualstudio.com/Download 请根据电脑系统安装所需版本点击下载链接(一般情况下点击windows按钮即可)鼠标左键双击,即可运行安装程序,点击【确认】;选择安装路径…

Spring实例化的基本流程和Bean处理器

目录 Spring实例化的基本流程 Bean的处理器 Bean工厂后处理器(BeanFactoryPostProcessor) 动态注册beanDefinition Bean后处理器(BeanPostProcessor) Spring实例化的基本流程 在了解处理器之前,要清除spring实例化…

【SH】Ubuntu Server 24搭建Web服务器访问Python程序研发笔记

文章目录 说个问题写个方案一、安装Ubuntu Server二、安装Web服务器采用Nginx服务器 三、安装Python及依赖创建项目虚拟环境 四、安装Python Web框架采用Flask框架创建和运行Flask应用(以后的重点) 五、安装WSGI服务器采用Gunicorn 六、配置Nginx七、验证…

109.【C语言】数据结构之求二叉树的高度

目录 1.知识回顾:高度(也称深度) 2.分析 设计代码框架 返回左右子树高度较大的那个的写法一:if语句 返回左右子树高度较大的那个的写法二:三目操作符 3.代码 4.反思 问题 出问题的代码 改进后的代码 执行结果 1.知识回顾&#xf…

瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 文章目录 3 项目组件优化3.1 实现Swagger文档输出3.2 实现logback日志打印3.3 实现表单校验功能3.4 实现请求参数和响应参数的打印 3 项目组件优化 3.1 实现Swagger文档输出 1)在application.yml中增加knife4…

OpenEuler 22.03 安装 flink-1.17.2 集群

零:规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器,用于搭建 flink 集群。这里使用flink1.17.2 的原因,是便于后续与springboot的整合 服务器名IP地址作用其他应用flink01192.168.159.133主jdk11、flink-1.17.2flink02192.168.…

[数据结构] 链表

目录 1.链表的基本概念 2.链表的实现 -- 节点的构造和链接 节点如何构造? 如何将链表关联起来? 3.链表的方法(功能) 1).display() -- 链表的遍历 2).size() -- 求链表的长度 3).addFirst(int val) -- 头插法 4).addLast(int val) -- 尾插法 5).addIndex -- 在任意位置…

20241220在荣品开发板PRO-RK3566的buildroot下适配gc2093

20241220在荣品开发板PRO-RK3566的buildroot下适配gc2093 2024/12/20 16:00 余顺?PRO-RK3566开发板 挂 gc2093模块。刷 buildroot的预编译固件。 update-pro-rk3566-buildroot-hdmi-20231130-034633.img 1、现在发现 qcamera的 拍照Capture、Record录像模式都是640x480分辨率…

实习冲刺数据库练习-01 基础查询

原题链接:牛客网在线编程_SQL篇_非技术快速入门 数据表示例: 根据数据表示例要求我们完成以下查询: (1)获取用户信息表中所有的数据,请你取出相应结果 (2)获取用户的设备id对应的…

【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换

相关链接: http://mars3d.cn/editor-vue.html?keyex_1_2_1&idmap/other/backgroundImg 实现代码: export function show1() {map.setOptions({scene: {backgroundType: "image",backgroundImage: "url(//data.mars3d.cn/img/busin…

telnet命令检查端口

1、简介 telnet是一种用于远程登录的协议,可以通过telnet客户端连接到远程主机,并在远程主机上执行命令。 2、使用telnet命令检查端口 2.1 进入linux终端 2.2 输入telnet命令 如果没有安装telnet命令,请执行以下命令安装 sudo yum install…

Unity 根据文本宽度自动移动图像位置

游戏中有时候需要变动的显示一个物品的数量,变化的文本宽度不停的变化,这时候需要将物品的icon随着文本的长度而改变位置。 实现思路:使用Content Size Fitter来动态改变内容的大小。 首先建立一个文本组件,添加Content Size Fi…