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

news2024/12/20 10:05:43

一、引言


在数据科学的世界里,视觉传达是不可或缺的一环。一个好的数据可视化不仅能传递信息,还能引发共鸣。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 教你绘制高颜值散点图

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

领域驱动设计的学习分享

DDD 是什么 领域驱动设计(Domain Driven Design) 是一种从系统分析到软件建模的一套方法论。以领域为核心驱动力的设计体系。 为什么使用 面向对象设计,数据行为绑定,告别贫血模型优先考虑领域模型,而不是切割数据和行为准确传达业务规则…

Three.js推荐-可以和Three.js结合的动画库

在 Three.js 中,3D 模型、相机、光照等对象的变换(如位置、旋转、缩放)通常需要通过动画进行控制,以实现更加生动和富有表现力的效果。然而,Three.js 本身并没有内置的强大动画管理系统,尽管可以通过关键帧…

vue+springboot+cas配置及cookie传递问题

cookie的注意事项 前边的文章已经介绍过cookie的基本信息,这里再次说明一点:cookie是无法进行跨域传递的,很多时候cookie无法设置和传递都是因为跨域问题,ip/端口不一致。 主要就是:被设置cookie和要传递cookie的地址…

Mac升级macOS 15 Sequoia后,无法ssh连接本地虚拟机

现象 macOS 15后,无法ssh连接本地启动的虚拟机,提示错误: No route to host,也ping不通。包括UTM、Parallels Desktop这两个虚拟机软件。之前都是没问题的,通过一些简单排查,目前没发现什么问题。 在虚拟…

使用 NVIDIA DALI 计算视频的光流

引言 光流(Optical Flow)是计算机视觉中的一种技术,主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场,广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…

c语言----顺序结构

顺序结构的基本概念 定义:顺序结构是C语言程序中最基本的结构,它按照语句的先后顺序依次执行。就像我们日常做事一样,一步一步地按照顺序来完成任务。在C语言程序中,从程序的第一条语句开始,逐句向下执行,…

基于base32的兑换码算法(思路)

base32编码指的是基于32个可打印字符对任意字节数据进行编码:大写字母A-Z以及数字2-7。 兑换码要求:长度为10个字符 如果将这32个字符依次放到一个base数组中,那么最大的下标就是31。我们将要编码的任意字节数据按照五个bit为一组进行划分,…

python学opencv|读取图像(十六)修改HSV图像HSV值

【1】引言 前序学习进程中,我们已经掌握了对HSV通道和BGR通道的拆分和合并,并通过自由组合的形式,获得了和初始图像完全不一样的新图像,相关文章可以参考下述链接: python学opencv|读取图像(十四&#xf…

用QT制作的倒计时软件

一、pro代码 RC_ICONS countdown.ico 二、mainwindow.cpp代码 #include "mainwindow.h" #include "ui_mainwindow.h"#include <QDateTime> #include <QMessageBox> #include <QSettings>MainWindow::MainWindow(QWidget *parent): QM…

VScode MAC按任意键关闭终端 想要访问桌面文件

说明 最近配置MAC上CPP的运行环境&#xff0c;在安装必要的CPP插件后&#xff0c;配置launch和task等json文件后&#xff0c;点击运行三角形&#xff0c;每次都会跳出main想要访问桌面上的文件。并且输出也是在调试控制台&#xff0c;非常逆天。 尝试 尝试1:尽管我尝试将ta…

【一本通】线段

【一本通】线段 C语言代码Java代码C代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 数轴上有 n条线段&#xff0c;选取其中 k条线段使得这 k条线段两两没有重合部分&#xff0c;问最大的k为多少? 输入 输入文件segment.in的第一行为…

学习日志024--opencv中处理轮廓的函数

目录 前言​​​​​​​ 一、 梯度处理的sobel算子函数 功能 参数 返回值 代码演示 二、梯度处理拉普拉斯算子 功能 参数 返回值 代码演示 三、Canny算子 功能 参数 返回值 代码演示 四、findContours函数与drawContours函数 功能 参数 返回值 代码演示 …

关于分页的样式问题

在最近写网页的时候遇到了一个关于样式的问题&#xff0c;今天我来跟大家来说一下。像是分页中的颜色效果&#xff0c;斑马纹颜色要注意颜色不要过于深。 这种的颜色就有一点深看着很不舒服&#xff0c;应将当前的颜色改为淡一点的&#xff0c;也可以利用rgba调整透明度&#x…

机器学习周报(12.9-12.15)

文章目录 摘要Abstract 1 Swin Transformer1.1 输入1.2 Patch Partition1.3 Linear Embedding1.4 Patch Merging1.5 Swin Transformer Block1.6 代码总结 摘要 本篇博客介绍了采用类似于卷积核的移动窗口进行图像特征提取的Swin Transformer网络模型&#xff0c;这是一种基于T…

基于Spring Boot的校园车辆管理系统

一、系统背景与意义 随着校园规模的不断扩大和车辆数量的增加&#xff0c;传统的车辆管理方式已经难以满足高效、准确管理车辆的需求。因此&#xff0c;开发一个基于Spring Boot的校园车辆管理系统具有重要的现实意义。该系统可以实现对校园车辆的信息化管理&#xff0c;提高车…

SpringBoot3整合FastJSON2如何配置configureMessageConverters

在 Spring Boot 3 中整合 FastJSON 2 主要涉及到以下几个步骤&#xff0c;包括添加依赖、配置 FastJSON 作为 JSON 处理器等。下面是详细的步骤&#xff1a; 1. 添加依赖 首先&#xff0c;你需要在你的 pom.xml 文件中添加 FastJSON 2 的依赖。以下是 Maven 依赖的示例&#…

隐私清理工具Goversoft Privazer

PrivaZer 是一款专为隐私保护而生的 Windows 系统清理工具&#xff0c;支持深度扫描、清除无用文件和隐私痕迹。 PrivaZer - 深度扫描磁盘&#xff0c;自动清理上网痕迹&#xff0c;全面保护 Windows 的网络隐私 释放磁盘空间 硬盘空间告急&#xff0c;想清理却又无从下手&…

UDP网络编程套接

目录 本文核心 预备知识 1.端口号 认识TCP协议 认识UDP协议 网络字节序 socket编程接口 sockaddr结构 UDP套接字编程 服务端 客户端 TCP与UDP传输的区别 可靠性&#xff1a; 传输方式&#xff1a; 用途&#xff1a; 头部开销&#xff1a; 速度&#xff1a; li…

3.zabbix中文设置

1、zabbix中文设置 2、中文乱码的原因 zabbix使用DejaVuSan.ttf字体&#xff0c;不支持中文&#xff0c;导致中文出现乱码。解决方法很简单&#xff0c;把我们电脑里面字体文件传到zabbix服务器上。 3、解决zabbix乱码方法 3.1、从Window服务器找到相应的字休复制到zabbix S…

【Vue3学习】setup语法糖中的ref,reactive,toRef,toRefs

在 Vue 3 的组合式 API&#xff08;Composition API&#xff09;中&#xff0c;ref、reactive、toRef 和 toRefs 是四个非常重要的工具函数&#xff0c;用于创建和管理响应式数据。 一、ref 用ref()包裹数据,返回的响应式引用对象&#xff0c;包含一个 .value 属性&#xff0…