Seaborn从零开始学习教程(二)

简介: 本次将主要介绍颜色风格设置的使用。

seaborn的学习内容主要包含以下几个部分:

  1. 风格管理
  • 绘图风格设置
  • 颜色风格设置
  1. 绘图方法
  • 数据集的分布可视化
  • 分类数据可视化
  • 线性关系可视化
  1. 结构网格
  • 数据识别网格绘图

本次将主要介绍颜色风格设置的使用。


颜色风格设置


Seaborn的使用中,是可以针对数据类型而选择合适的颜色,并且使用选择的颜色进行可视化,节省了大量的可视化的颜色调整工作。

还是一样,在介绍如何使用颜色外观设置之前,我们引入所需要的模块。

%matplotlib inline
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
sns.set(rc={"figure.figsize": (6, 6)})
np.random.seed(sum(map(ord, "palettes")))


下面所有操作均在 Jupyter notebook 中执行,如果对这个软件还不熟悉的朋友可以参考:Seaborn从零开始学习教程(一)


创建调色板


对于外观颜色设置而言,最重要的函数要属color_palette了。这个函数拥有许多方法,让你可以随心所欲的可以生成各种颜色。并且,它可以被任何有palette参数的函数在内部进行使用(palette 的中文意思是 "调色板")。

关于这个函数有几个点需要知道一下:

  • color_palette函数可以接受任何seaborn或者matplotlib颜色表中颜色名称(除了jet),也可以接受任何有效的 matplolib 形式的颜色列表(比如RGB元组,hex颜色代码,或者HTML颜色名称)。
  • 这个函数的返回值总是一个由RGB元组组成的列表,无参数调用color_palette函数则会返回当前默认的色环的列表,比如:

微信图片_20220217211745.jpg

  • 还有一个相应的函数,是set_palette,它接受与color_palette一样的参数,并会对所有的绘图的默认色环进行设置。当然,你也可以在with语句中使用color_palette来临时的改变默认颜色。

通常,在不知道数据特点的情况下,要找出并知道哪组颜色对一组数据是最好的有点不太现实。因此,我们将分为多种方式来使用color_palette函数和其它的 seaborn paletee 函数。

有三种通用的color palette可以使用,它们分别是:qualitativesequentialdiverging


1. 分类色板(qualitative)


Qualitative调色板,也可以说成是 分类 调色板,因为它对于分类数据的显示很有帮助。当你想要区别 "不连续的且内在没有顺序关系的 数据时",这个方式是最好的。

当导入seaborn时,默认的色环就被改变成一组包含6种颜色的调色板,它使用了标准的matplolib色环,为了让绘图变得更好看一些。

current_palette = sns.color_palette()
sns.palplot(current_palette)

微信图片_20220217212017.png

有6种不同的默认主题,它们分别是:deepmutedpastelbirghtdarkcolorblind

themes = ['deep', 'muted', 'pastel', 'bright', 'dark', 'colorblind']
for theme in themes:
    current_palette = sns.color_palette(theme)
    sns.palplot(current_palette)

微信图片_20220217212106.jpg

使用色圈系统


默认的6种颜色看上去真不错,但是如果我们想要超过6种颜色呢?

当你有超过6种类型的数据要区分时,最简单的方法就是 在一个色圈空间内使用均匀分布的颜色。这也是当需要使用更多颜色时大多数seaborn函数的默认方式。

最常用的方法就是使用 hls 色空间,它是一种简单的RGB值的转换。

sns.palplot(sns.color_palette("hls", 8))

微信图片_20220217212141.jpg

除此之外,还有一个 hls_palette 函数,它可以让你控制 hls 颜色的亮度和饱和度。

sns.palplot(sns.hls_palette(8, l=.3, s=.8))

微信图片_20220217212304.png

然而,由于人类视觉系统工作的原因,根据RGB颜色产生的平均视觉强度的颜色,从视觉上看起来并不是相同的强度。如果你观察仔细,就会察觉到,黄色和绿色会更亮一些,而蓝色则相对暗一些。因此,如果你想用hls系统达到一致性的效果,就会出现上面的问题。

为了修补这个问题,seabornhls系统提供了一个接口,可以让操作者简单容易的选择均匀分布,且亮度和饱和度看上去明显一致的色调。

sns.palplot(sns.color_palette("husl", 8))

微信图片_20220217212427.png同样与之对应的,也有个husl_palette函数提供更灵活的操作。


使用分类Color Brewer调色

另外一种对分类数据比较友好的调色源自Color Brewer工具的使用。虽然在matplotlib中也存在这些颜色表,但是它们并没有被合适的处理。在seaborn中,当你想要使用 Color Brewer 调色板的时候,你总是可以得到不连续颜色,但是这也意味着在某一点上,这些颜色将会开始循环。

Color Brewer 网站中的一个很好的特点就是它提供了一个色盲安全指导。色盲颜色有很多种 http://en.wikipedia.org/wiki/Color_blindness,但是最常见的当属辨别绿色和红色。如果可以避免使用红色和绿色来对绘图元素上色,那么对于一些色盲人群将会是一个很好的消息。

下面两组颜色就是使用红色和绿色组合,这可能并不是最好的选择。


sns.palplot(sns.color_palette("Paired"))

微信图片_20220217212532.jpg

sns.palplot(sns.color_palette("Set2", 10))

微信图片_20220217212659.png

为了避免这些组合,我们需要从Color Brewer库中进行选择调色,seaborn 中有一个专门的 choose_colorbrewer_palette 函数可以实现这个功能。这个函数需要在 IPython notebook 中使用,因为 notebook 是一个交互式的工具,可以让你浏览各种选择并且调节参数。下面是在Jupyter notebook中使用该函数进行的调色过程,分别为三种分类:qualitativesequentialdiverging

sns_tpye = ["qualitative", "sequential", "diverging"]
for elem in sns_type:
    sns.choose_colorbrewer_palette(elem)

微信图片_20220217212721.jpg

微信图片_20220217212725.jpg

微信图片_20220217212728.jpg

  • n:调节颜色的个数
  • desat:调节明暗和饱和度

当然,您可能只想使用一组您特别喜欢的颜色。因为color_palette()接受一个颜色列表,这很容易做到。

flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]
sns.palplot(sns.color_palette(flatui))

微信图片_20220217212819.jpg

使用xkcd颜色来命名颜色


在众多的努力帮助下,xkcd 完成了随机的 RGB 颜色的命名。一共生成了954个颜色(http://xkcd.com/color/rgb/),并可以随时通过xkcd_rgb字典调用。

plt.plot([0, 1], [0, 1], sns.xkcd_rgb["pale red"], lw=3)
plt.plot([0, 1], [0, 2], sns.xkcd_rgb["medium green"], lw=3)
plt.plot([0, 1], [0, 3], sns.xkcd_rgb["denim blue"], lw=3);

微信图片_20220217212845.jpg

如果想要从 xkcd_rgb 字典中单独的抽取出一些颜色,你也可以将一组选择好的颜色放到 xkcd_palette 函数中。

colors = ["windows blue", "amber", "greyish", "faded green", "dusty purple"]
sns.palplot(sns.xkcd_palette(colors))

微信图片_20220217213005.png

2. 连续色板(sequential)


调色板的第二大类被成为 "顺序",这种调色板对于有从低(无意义)到高(有意义)范围过度的数据非常适合。尽管有些时候你可能想要在连续色板中使用不连续颜色,但是更通用的情况下是连续色板会作为颜色表在 kdeplot() 或者 corrplot() 或是一些 matplotlib 的函数中使用。

对于连续的数据,最好是使用那些在色调上有相对细微变化的调色板,同时在亮度和饱和度上有很大的变化。这种方法将自然地将数据中相对重要的部分成为关注点。

Color Brewer 的字典中就有一组很好的调色板。它们是以在调色板中的主导颜色(或颜色)命名的。

sns.palplot(sns.color_palette("Blues"))

微信图片_20220217213513.png

就像在matplotlib中一样,如果您想要翻转渐变,您可以在面板名称中添加一个_r后缀。

sns.palplot(sns.color_palette("BuGn_r"))

微信图片_20220217213530.jpg

就像在matplotlib中一样,如果您想要翻转渐变,您可以在面板名称中添加一个_r后缀。

sns.palplot(sns.color_palette("BuGn_r"))

微信图片_20220217213554.jpg

这里需要注意的是,你可能想使用 choose_colorbrewer_palette() 函数去绘制各种不同的选项。如果你想返回一个变量当做颜色映射传入seaborn或matplotlib的函数中,可以设置 as_cmap 参数为True,后面也会提到。


“cubehelix”连续调色板


cubehelix调色板系统在亮度和色变变化上具有线性上升或下降的特点。这意味着,当颜色表中的信息被转化为黑色和白色或者被一个色盲者看到的时候,它将会被保存下来。

matplotlib 有内建的默认cubehelix 版本:

sns.palplot(sns.color_palette("cubehelix", 8))

微信图片_20220217213647.png

seaborn为cubehelix系统添加一个接口使得其可以在各种变化中都保持良好的亮度线性梯度。

通过seaborn的cubehelix_palette()函数返回的调色板与matplotlib默认值稍有所不同,它不会在色轮周围旋转或覆盖更广的强度范围。seaborn还颠倒了排序使得更重要的值显得更暗:

sns.palplot(sns.cubehelix_palette(8))

微信图片_20220217213723.jpg

其他cubehelix_palette()的参数主要调整色板的视觉效果。两个重要的参数是:start(值的范围为03)和rot,或者旋转的次数(-1和1之间)。

sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))

微信图片_20220217213817.jpg

你也可以控制断点的亮度和甚至对调结果顺序:

sns.palplot(sns.cubehelix_palette(8, start=2, rot=0, dark=0, light=.95, reverse=True))

微信图片_20220217213822.jpg

默认情况下你只会得到一些像seaborn其它调色板一样的颜色列表,但你也可以通过使用as_cmap=True让调色板返回一个可以被传入seaborn或matplotlib函数的颜色映射对象。

x, y = np.random.multivariate_normal([0, 0], [[1, -.5], [-.5, 1]], size=300).T
cmap = sns.cubehelix_palette(light=1, as_cmap=True)
sns.kdeplot(x, y, cmap=cmap, shade=True);

微信图片_20220217213934.png

与前面提到的一样,同样也可以在 notebook 中使用choose_cubehelix_palette()来调节参数帮助选择更适合的调色板或颜色映射。如果想让函数返回一个类似hexbin的颜色映射而非一个列表则需要传入as_cmap=True


定制的连续调色板

对于一个更简单的接口定制连续色板,你可以使用 light_palette() 或者 dark_palette()函数。它们都是单一颜色,并且能产生从亮值或者暗去饱和的值到这个颜色的调色板。

与上面提到的用法一样,对于定制连续色板也同样有choose_light_palettechoose_dark_palette 两个函数来交互式的调节创建调色板。

sns.palplot(sns.light_palette("green"))

微信图片_20220217213959.jpg

sns.palplot(sns.dark_palette("purple"))
微信图片_20220217214021.jpg

sns.palplot(sns.light_palette("navy", reverse=True))

微信图片_20220217214157.png

通过它们也可以创建一个颜色映射对象,而不仅仅是颜色列表。

pal = sns.dark_palette("palegreen", as_cmap=True)
sns.kdeplot(x, y, cmap=pal);

微信图片_20220217214251.png

默认情况下,任何有效的matplotlib颜色可以作为输入。另外辅助的解释可以由input参数来控制。目前你可以在hls或husl空间中提供默认的rgb元组,您还可以使用任何有效的xkcd颜色的种子。

sns.palplot(sns.light_palette((210, 90, 60), input="husl"))

微信图片_20220217214314.jpg

sns.palplot(sns.dark_palette("muted purple", input="xkcd"))

微信图片_20220217214340.jpg

需要注意的是,husl是提供交互的组件的默认input空间,这与函数自身默认的并不同,但这在背景下却是更有用的。


3. 离散色板(diverging)


调色板中的第三类被称为“离散”。这类色板适用于数据特征含有大的低值和大的高值。数据中通常有一个意义明确的中点。例如,如果你想要从某个基线时间点绘制温度变化,最好使用离散的颜色表显示相对降低和相对增加面积的地区。

除了你想满足一个低强度颜色的中点以及用不同起始颜色的两个相对微妙的变化,其实选择离散色板的规则类似于顺序色板。同样重要的是,起始值的亮度和饱和度是相同的。

同样重要的是要强调,应该避免使用红色和绿色,因为大量的潜在观众将无法分辨它们。

Color Brewer颜色字典里也同时拥有一套精心挑选的离散颜色映射:


sns.palplot(sns.color_palette("BrBG", 7))

微信图片_20220217214404.jpg

sns.palplot(sns.color_palette("RdBu_r", 7))

微信图片_20220217214431.jpg

sns.palplot(sns.color_palette("coolwarm", 7))

微信图片_20220217214517.jpg


定制的离散调色板


你也可以使用 seaborn 函数 diverging_palette() 为离散的数据创建一个定制的颜色映射(当然也有一个类似配套的互动工具:choose_diverging_palette())。该函数使用husl颜色系统的离散色板。你需要传递两种色调,并可选择性的设定明度和饱和度的端点。函数将使用husl的端点值及由此产生的中间值进行均衡。

函数将使用husl的端点值及由此产生的中间值进行均衡。

sns.palplot(sns.diverging_palette(220, 20, n=7))

微信图片_20220217214537.jpg

sns.palplot(sns.diverging_palette(145, 280, s=85, l=25, n=7))

微信图片_20220217214604.jpg

sep参数控制面板中间区域的两个渐变的宽度。

sns.palplot(sns.diverging_palette(10, 220, sep=80, n=7))

微信图片_20220217214625.jpg

sep参数控制面板中间区域的两个渐变的宽度。

sns.palplot(sns.diverging_palette(10, 220, sep=80, n=7))

微信图片_20220217214652.jpg


设置默认的调色板


color_palette() 函数拥有一个名为 set_palette() 的配套使用函数。 set_palette() 接受与 color_palette() 相同的参数,但是它会更改默认的 matplotlib 参数,以便成为所有的调色板配置。

def sinplot(flip=1):
    x = np.linspace(0, 14, 100)
    for i in range(1, 7):
        plt.plot(x, np.sin(x + i * .5) * (7 - i) * flip)
sns.set_palette("husl")
sinplot()

微信图片_20220217214820.jpg

color_palette()函数也可以在一个with块中使用,以达到临时更改调色板的目的。

with sns.color_palette("PuBuGn_d"):
    sinplot()

微信图片_20220217214844.jpg


总结

  • 本篇介绍了seaborn中的颜色调控方法,提到的一个重要函数是:color_palette()。针对不同的数据类型有三种调色方式:
  • 分类色板(qualitative)
  • 连续色板(sequential)
  • 离散色板(diverging)
  • 其中还提到了 Color Brewer 工具,它可以很好的应用在以上三种调色方式上。
  • 记住还有一个很有用的函数 choose_xxx_paletee(),用于交互式的调试颜色。
  • 还可以通过 set_palette() 函数设置绘图默认参数。
相关文章
|
8天前
|
BI Python
SciPy 教程 之 Scipy 显著性检验 8
本教程介绍SciPy中显著性检验的应用,包括如何利用scipy.stats模块进行显著性检验,以判断样本与总体假设间的差异是否显著。通过示例代码展示了如何使用describe()函数获取数组的统计描述信息,如观测次数、最小最大值、均值、方差等。
19 1
|
9天前
|
Python
SciPy 教程 之 Scipy 显著性检验 6
显著性检验是统计学中用于判断样本与总体假设间是否存在显著差异的方法。SciPy的scipy.stats模块提供了执行显著性检验的工具,如T检验,用于比较两组数据的均值是否来自同一分布。通过ttest_ind()函数,可以获取两样本的t统计量和p值,进而判断差异是否显著。示例代码展示了如何使用该函数进行T检验并输出结果。
14 1
|
11天前
|
Python
SciPy 教程 之 Scipy 显著性检验 3
本教程介绍Scipy显著性检验,包括其基本概念、原理及应用。显著性检验用于判断样本与总体假设间的差异是否显著,是统计学中的重要工具。Scipy通过`scipy.stats`模块提供了相关功能,支持双边检验等方法。
20 1
|
13天前
|
机器学习/深度学习 Python
SciPy 教程 之 SciPy 插值 2
SciPy插值教程:介绍插值概念及其在数值分析中的应用,特别是在处理数据缺失时的插补和平滑数据集。SciPy的`scipy.interpolate`模块提供了强大的插值功能,如一维插值和样条插值。通过`UnivariateSpline()`函数,可以轻松实现单变量插值,示例代码展示了如何对非线性点进行插值计算。
18 3
|
13天前
|
移动开发 数据可视化 数据挖掘
利用Python实现数据可视化:以Matplotlib和Seaborn为例
【10月更文挑战第37天】本文旨在引导读者理解并掌握使用Python进行数据可视化的基本方法。通过深入浅出的介绍,我们将探索如何使用两个流行的库——Matplotlib和Seaborn,来创建引人入胜的图表。文章将通过具体示例展示如何从简单的图表开始,逐步过渡到更复杂的可视化技术,帮助初学者构建起强大的数据呈现能力。
|
16天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 4
本教程介绍了SciPy的空间数据处理功能,主要通过scipy.spatial模块实现。内容涵盖空间数据的基本概念、距离矩阵的定义及其在生物信息学中的应用,以及如何计算欧几里得距离。示例代码展示了如何使用SciPy计算两点间的欧几里得距离。
31 5
|
15天前
|
机器学习/深度学习 Python
SciPy 教程 之 SciPy 空间数据 6
本教程介绍了SciPy处理空间数据的方法,包括使用scipy.spatial模块进行点位置判断、最近点计算等内容。还详细讲解了距离矩阵的概念及其应用,如在生物信息学中表示蛋白质结构等。最后,通过实例演示了如何计算两点间的余弦距离。
26 3
|
14天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 7
本教程介绍了SciPy的空间数据处理功能,涵盖如何使用`scipy.spatial`模块进行点的位置判断、最近点计算等操作。还详细解释了距离矩阵的概念及其在生物信息学中的应用,以及汉明距离的定义和计算方法。示例代码展示了如何计算两个点之间的汉明距离。
25 1
|
10天前
|
Python
SciPy 教程 之 Scipy 显著性检验 5
显著性检验用于判断样本与总体假设间的差异是否由随机变异引起,或是假设与真实情况不符所致。SciPy通过scipy.stats模块提供显著性检验功能,P值用于衡量数据接近极端程度,与alpha值对比以决定统计显著性。
16 0
|
12天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 插值 3
本教程介绍了SciPy中的插值方法,包括什么是插值及其在数据处理和机器学习中的应用。通过 `scipy.interpolate` 模块,特别是 `Rbf()` 函数,展示了如何实现径向基函数插值,以平滑数据集中的离散点。示例代码演示了如何使用 `Rbf()` 函数进行插值计算。
21 0
下一篇
无影云桌面