Python 可视化--seaborn

seaborn
Seaborn是一个基于matplotlib的Python数据可视化库。 它提供了用于绘制引人入胜且内容丰富的统计图形的高级接口。

1. 安装

您可以使用pip安装最新版本的seaborn

pip install seaborn

也可以使用conda安装发布的版本:

conda install seaborn

另外,您可以使用pip直接从github安装开发版本:

pip install git+https://github.com/mwaskom/seaborn.git

另一个选择是克隆github仓库并从本地副本安装:

pip install .

注意seaborn依赖项

2. seaborn与matplotlib对比

让我们定义一个简单的函数来绘制一些偏移正弦波,通过其简单地对比seaborn和matplotlib的不同风格。切换到seaborn默认值,只需调用set()函数。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# matplotlib or seaborn
style = 'seaborn'


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)


if style == 'matplotlib':
    sinplot()
else:
    sns.set()
    sinplot()

plt.show()

左边是matplotlib默认情况下的图形,右边是seaborn默认情况下的图形:

matplotlib-seaborn
Seaborn将matplotlib参数分为两个独立的组。 第一组设置plot的美学风格,第二组缩放图形的各种元素,以便可以轻松地将其合并到不同的上下文中。

操纵这些参数的接口是两对函数。要控制样式,使用axes_style()set_style()函数。要缩放绘图,使用 plotting_context()set_context()函数。在这两种情况下,第一个函数返回参数字典,第二个函数设置matplotlib默认值。

3. 风格设置

3.1 主题设置

seaborn预设五种主题样式:darkgrid(默认)、whitegriddarkwhiteticks。它们将影响轴的颜色、网格是否启用以及其他美学元素。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


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)


# five theme: darkgrid, whitegrid, dark, white, and ticks.
styles = ['darkgrid', 'whitegrid', 'dark', 'white', 'ticks']
select_style = styles[4]
sns.set_style(select_style)
sinplot()
plt.xlabel(select_style)
plt.show()

theme

3.2 轴设置

white和ticks主题样式可以移除不需要的上轴和右轴,通过调用seaborn的despine()函数实现。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


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)


styles = ['white', 'ticks']
select_style = styles[1]
sns.set_style(select_style)
sinplot()
# remove axes spines
sns.despine()
plt.xlabel(select_style)
plt.show()

remvoe-axes-spine

一些图可以从数据中偏移轴,这也可以调用despine()完成。当刻度没有覆盖轴的整个范围时,trim参数将限制轴的范围。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.set_style("white")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
f, ax = plt.subplots()
sns.violinplot(data=data)
# offset and trim
sns.despine(offset=10, trim=True)
plt.show()

remove-axes-spine-offset-strim

还可以使用despine()的附加参数来控制删除哪些轴。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.set_style("whitegrid")
data = np.random.normal(size=(20, 6)) + np.arange(6) / 2
sns.boxplot(data=data, palette="deep")
# remove which spines: top, right, left, bottom
sns.despine(left=True)
plt.show()

remove-axes-spine-left

3.3 临时设置图形样式

虽然来回切换很容易,但是也可以在with语句中使用axes_style()函数来临时设置绘图参数。这也允许您使用不同样式的轴制作图形:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


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)


f = plt.figure(figsize=(6, 6))
gs = f.add_gridspec(2, 2)

with sns.axes_style("darkgrid"):
    ax = f.add_subplot(gs[0, 0])
    sinplot()

with sns.axes_style("white"):
    ax = f.add_subplot(gs[0, 1])
    sinplot()

with sns.axes_style("ticks"):
    ax = f.add_subplot(gs[1, 0])
    sinplot()

with sns.axes_style("whitegrid"):
    ax = f.add_subplot(gs[1, 1])
    sinplot()

f.tight_layout()
plt.show()

temporarily-figure-style

3.4 重写seaborn样式

如果想要自定义seaborn样式,可以将参数字典传递给axes_style()set_style()的rc参数。请注意只能通过此方法覆盖属于样式定义一部分的参数。(然而,更高级的set()函数采用任何matplotlib参数的字典)。

如果想查看包含哪些参数,只需调用不带参数的函数,它将返回当前设置:

sns.axes_style()
{'axes.facecolor': 'white',
 'axes.edgecolor': '.8',
 'axes.grid': True,
 'axes.axisbelow': True,
 'axes.labelcolor': '.15',
 'figure.facecolor': 'white',
 'grid.color': '.8',
 'grid.linestyle': '-',
 'text.color': '.15',
 'xtick.color': '.15',
 'ytick.color': '.15',
 'xtick.direction': 'out',
 'ytick.direction': 'out',
 'lines.solid_capstyle': 'round',
 'patch.edgecolor': 'w',
 'image.cmap': 'rocket',
 'font.family': ['sans-serif'],
 'font.sans-serif': ['Arial',
  'DejaVu Sans',
  'Liberation Sans',
  'Bitstream Vera Sans',
  'sans-serif'],
 'patch.force_edgecolor': True,
 'xtick.bottom': False,
 'xtick.top': False,
 'ytick.left': False,
 'ytick.right': False,
 'axes.spines.left': True,
 'axes.spines.bottom': True,
 'axes.spines.right': True,
 'axes.spines.top': True}

然后可以设置这些参数的不同版本:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


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_style("darkgrid", {"axes.facecolor": ".9"})
sinplot()
plt.show()

override-style

3.5 缩放元素

一组单独的参数控制绘图元素的比例,这将使您可以使用相同的代码制作适用于较大或较小绘图的设置。

四个预设的上下文,按相对大小的顺序是paper(默认)、 notebooktalkposter

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


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)


# scaling plot elements
contexts = ['paper', 'notebook', 'talk', 'poster']
select_context = contexts[3]
sns.set()
sns.set_context(select_context)
sinplot()
plt.title(select_context)
plt.show()

context

您可以使用这些名称之一调用set_context()来设置参数,并且可以通过提供参数值字典来覆盖参数。

您还可以在更改上下文时独立缩放字体元素的大小。(此选项也可通过顶层set()函数实现)。

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt


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()
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
sinplot()
plt.show()

scale

同样,您可以用with语句临时控制嵌套的图形比例。

使用set()函数可以快速配置样式和上下文。该函数还可以设置默认的调色板。

4. 颜色设置

颜色比图形样式的其他方面更为重要,因为如果有效使用颜色,则颜色可以显示数据中的模式,而如果使用不充分,则颜色可以隐藏这些模式。 有很多很棒的资源来学习在可视化中使用颜色的良好技术,其中可以查看Rob Simmon撰写的系列博客文章和更多技术文章。 matplotlib文档现在还有一个不错的教程,它说明了内置颜色图的一些感知属性。

通过Seaborn,可以轻松选择和使用适合您正在使用的数据类型以及可视化目标的调色板。

4.1 构建调色板

使用离散调色板最重要的函数是color_palette()。这个函数为在seaborn中生成颜色的许多(虽然不是全部)可能的方法提供了一个接口,并且它被任何具有palette参数的函数内部使用(在某些情况下,当需要多种颜色时,对于color参数也是如此)。

color_palette()将接受任何seaborn调色板或matplotlib颜色图的名称(jet除外,您不应该使用它)。它还可以采用任何有效的matplotlib格式(RGB元组、十六进制颜色代码或HTML颜色名称)指定的颜色列表。返回值始终是一个RGB元组列表。

最后,不带参数地调用color_palette()将返回当前默认的颜色循环。

相应的函数set_palette()采用相同的参数,并将为所有图设置默认的颜色循环。您也可以在with语句中使用color_palette()来临时更改默认调色板(参见下文)。

如果不了解数据的特性,通常不可能知道哪种调色板或色图最适合一组数据。接下来,我们将把使用color_palette()和其他seaborn调色板函数的不同方式分成三种通用的调色板:qualitative, sequential, and diverging

4.2 Qualitative

当您想区分没有固有顺序的离散数据块时,Qualitative(或分类)调色板是最好的。

导入seaborn时,默认颜色周期会更改为一组十种颜色,以唤起标准的matplotlib颜色周期,同时旨在使外观更加美观。

import seaborn as sns
import matplotlib.pyplot as plt

sns.set()
# default color cycle
current_palette = sns.color_palette()
sns.palplot(current_palette)
plt.show()

current-palette

发布了66 篇原创文章 · 获赞 101 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/u010705932/article/details/104716589