Seaborn库简介

Seborn是一个基于matplotlib的Python数据可视化库, 它提供了一个高度交互式界面, 用于绘制有吸引力和信息量的统计图形.

Seaborn其实是在matplotlib的基础上进行了更高级的API封装, 从而使得作图更加容易, 在大多数情况下使用seaborn就能做出很具有吸引力的图, 而使用matplotlib就能制作具有更多特色的图. 所以应该把Seaborn视为matplotlib的补充, 而不是替代物. 同时它能高度兼容numpy与pandas以及scipy与statsmodels等科学计算库. 掌握seaborn能很大程度帮助我们更高效的观察数据与图表, 并且更加深入了解它们.

Seaborn其有如下特点:

  • 基于matplotlib aesthetics绘图风格, 增加了一些绘图模式;
  • 增加调色板功能, 利用色彩丰富的图像揭示您数据中的模式;
  • 运用数据子集绘制与比较单变量和双变量分布的功能;
  • 运用聚类算法可视化矩阵数据;
  • 灵活运用处理时间序列数据;
  • 利用网格建立复杂图像集.

Seaborn绘制散点图

seaborn.scatterplot(x=None, y=None, hue=None, style=None, size=None, data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, markers=True, style_order=None, alpha=’auto’, legend=’brief’, ax=None, **kwargs)

参数:

  • x, y (names of variables in data or vector data, optional): 输入的x, y 轴变量, 必须是数字. 可以直接传递数据, 或者引用data中的列.
  • hue(name of variables in data or vector data, optional): 将输入的变量分组, 并分别给与不同的颜色, 可以是文字分类列也可以是数字列, 这两者的结果会有所不同.
  • size(name of variables in data or vector data, optional): 将输入的变量分组, 并分别给与不同的大小, 可以是文字分类列也可以是数字列, 这两者的结果会有所不同.
  • style(name of variables in data or vector data, optional): 将输入的变量分组, 并分别给与不同的标志, 可以是文字分类列也可以是数字列, 但是数字列始终是被认为是分类标志.
  • data(DataFrame): 整齐数据框, 其中每一列都是变量, 每一行都是观察值.
  • palette (palette name, list, or dict, optional): 调色板, 要应用于hue不同级别的色板, 具体使用可以参考color_palette()
  • hue_order(list, optional): hue不同级别色彩出现的详细顺序, 不指定则由数据确定, 当hue变量为数字时不相关.
  • hue_norm(tuple or Normalize object, optional): 当hue变量为数值时, 使其归一化以上色.
  • sizes(list, dict, or tuple, optional): 当size已经给定了, 决定散点大小可选的list, 或者针对不同的size值给定不同的大小(dict), 当size值为数字时, 同样可以用元组(tuple)决定散点大小的范围.
  • size_order(list, optional): 散点大小不同级别的详细顺序. 不指定则由数据确定, 当size变量为数字时不相关.
  • size_norm(tuple or Normalize object, optional): 当size变量为数值时, 使其归一化以上色.
  • markers(boolean, list, or dictionary, optional): 散点标志, 设置为True则使用默认设置, 或者你可以给定一个marker的list以供选择, 你也可以根据style参数对不同的类别给定不同的marker(dict).
  • style_order(list, optional): marker不同级别出现的详细顺序, 不指定则由数据确定, 当style变量为数字时不相关.
  • alpha(float): 散点的透明度.
  • legend(“brief”, “full”, 或者 False, optional): 如何绘制图例, 如果是”brief”, 则数字的hue和size变量将以均匀的间隔表示(并不会把所有类别的图例都表示出来); 如果是”full”, 则每个类别都会在图例中表示出来; 如果是 False , 则不会绘制图例.
  • ax(matplotlib Axes, optional): 在哪个axes上绘制该图, 不填写则使用当前axes.
  • kwargs(key, value mappings): 其他关键字参数传递给 matplotlib.axes.Axes.scatter().

这边举几个例子:

这里我使用的是seaborn的官方数据集, 因为国内网络问题, 无法在线加载数据集, 我是下载后使用的, 数据集地址

绘制x为total_bill, y为tip的散点图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

tips = pd.read_csv("seaborn-data/tips.csv")
tips
"""输出结果:
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
... ... ... ... ... ... ... ...
239 29.03 5.92 Male No Sat Dinner 3
240 27.18 2.00 Female Yes Sat Dinner 2
241 22.67 2.00 Male Yes Sat Dinner 2
242 17.82 1.75 Male No Sat Dinner 2
243 18.78 3.00 Female No Thur Dinner 2
244 rows × 7 columns
"""

sns.scatterplot(x="total_bill", y="tip", data=tips)

绘制出来的图形如下:

seaborn01

按照不同的性别绘制不同的颜色:

1
sns.scatterplot(x="total_bill", y="tip", data=tips, hue='sex')

绘制出来的图形如下:

seaborn02

按照不同的size绘制不同的颜色:

1
sns.scatterplot(x="total_bill", y="tip", data=tips, hue='sex', size='size', legend='full')

绘制出来的图形如下:

seaborn03

按照是否抽烟绘制不同的marker:

1
sns.scatterplot(x="total_bill", y="tip", data=tips, hue='sex', size='size', style='smoker')

绘制出来的图形如下:

seaborn04

Seaborn绘制折线图

seaborn.lineplot(x=None, y=None, hue=None, size=None, style=None, data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, dashes=True, markers=None, style_order=None, units=None, estimator=’mean’, ci=95, n_boot=1000, seed=None, sort=True, err_style=’band’, err_kws=None, legend=’brief’, ax=None, **kwargs)

参数基本和散点图一样, 但是还是多了一些可用的参数:

  • dashes(boolean, list, or dictionary, optional): 确定为不同级别的style绘制什么样的marker. 设置为True将使用默认的dash codes, 或者你可以传递dash codes列表或style变量到dash codes的字典映射. 设置为False将对所有子集使用实线.
  • units(long_form_var): 分组变量标识采样单位. 使用时, 将使用适当的方式为每个unit绘制一条单独的线, 但不会添加图例. 当不需要精确的线条身份时, 可用于显示实验重复的分布.
  • estimator (name of pandas method or callable or None, optional): 在同一x级别上跨y变量的多个观测值进行聚合的方法. 如果为None, 将绘制所有观测值.
  • ci(int or “sd” or None, optional): 与估计量进行汇总时要绘制的置信区间的大小. “sd”表示绘制数据的标准差. 设置为None将跳过引导程序.
  • n_boot(int, optional): 用于计算置信区间的引导程序数.
  • seed(int, numpy.random.Generator, or numpy.random.RandomState, optional): 种子或随机数生成器, 可重现自举.
  • sort(boolean, optional): 如果为True, 则数据将按x和y变量排序, 否则线条将按照它们在数据集中出现的顺序出现.
  • err_style(“band” or “bars”, optional): 是否绘制具有半透明误差带或离散误差线的置信区间.
  • err_kws(dict of keyword arguments): 其他控制误差线外观的参数, 传递给matplotlib.axes.Axes.fill_between() 或者 matplotlib.axes.Axes.errorbar(), 取决于err_style.

举几个例子:

对于复杂的数据集, 如对相同的x变量值进行多次测量, seaborn中的默认行为是通过绘制平均值和围绕平均值的95%置信区间来聚合每个x值处的多个测量值.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

fmri = pd.read_csv("seaborn-data/fmri.csv")
fmri
"""输出结果:
subject timepoint event region signal
0 s13 18 stim parietal -0.017552
1 s5 14 stim parietal -0.080883
2 s12 18 stim parietal -0.081033
3 s11 18 stim parietal -0.046134
4 s10 18 stim parietal -0.037970
... ... ... ... ... ...
1059 s0 8 cue frontal 0.018165
1060 s13 7 cue frontal -0.029130
1061 s12 7 cue frontal -0.004939
1062 s11 7 cue frontal -0.025367
1063 s0 0 cue parietal -0.006899
1064 rows × 5 columns
"""

sns.lineplot(x="timepoint", y="signal", data=fmri)

绘制出来的图形如下:

seaborn05

使用自动计算置信区间, 对于较大的数据集, 可能会占用大量时间, 因此可以设置ci=None来禁用它.

参考资料

[1] Official seaborn tutorial - seaborn 0.10.1 documentation
[2] 10分钟python图表绘制 | seaborn入门(一):distplot与kdeplot - 知乎