Seaborn 数据可视化基础

Seaborn是基于Matplotlib的高级数据可视化库,提供了一套简洁的API,使得创建美观的图形变得容易。文章介绍了Seaborn的特点,如内置样式、调色板和简化多变量绘图,并展示了如何通过Seaborn优化Matplotlib的图形,包括散点图、线形图、类别图、分布图、回归图和矩阵图的绘制方法。此外,文章还提到了Seaborn与Matplotlib的关系,强调Seaborn更适合数据探索,而Matplotlib更适合定制化绘图。
摘要由CSDN通过智能技术生成

目录

介绍

知识点

Seaborn 介绍

快速优化图形

Seaborn 绘图 API

一、散点图:

参数hue

hue+ hue_order

参数style 

二 、线形图

三、类别图

绘制箱线图

绘制小提琴图

绘制增强箱线图

绘制点线图

绘制条形图

绘制计数条形图

四、分布图

五、回归图

六、矩阵图

课后习题

实验总结


介绍

        Matplotlib 是支持 Python 语言的开源绘图库,因为其支持丰富的绘图类型、简单的绘图方式以及完善的接口文档,深受 Python 工程师、科研学者、数据工程师等各类人士的喜欢。Seaborn 是以 Matplotlib 为核心的高阶绘图库,无需经过复杂的自定义即可绘制出更加漂亮的图形,非常适合用于数据可视化探索。

知识点

  • 关联图
  • 类别图
  • 分布图
  • 回归图
  • 矩阵图
  • 组合图

Seaborn 介绍

        Matplotlib 应该是基于 Python 语言最优秀的绘图库了,但是它也有一个十分令人头疼的问题,那就是太过于复杂了。3000 多页的官方文档,上千个方法以及数万个参数,属于典型的你可以用它做任何事,但又无从下手。尤其是,当你想通过 Matplotlib 调出非常漂亮的效果时,往往会伤透脑筋,非常麻烦。

        Seaborn 基于 Matplotlib 核心库进行了更高阶的 API 封装,可以让你轻松地画出更漂亮的图形。Seaborn 的漂亮主要体现在配色更加舒服、以及图形元素的样式更加细腻,下面是 Seaborn 官方给出的参考图。

Seaborn 具有如下特点:

  • 内置数个经过优化的样式效果。
  • 增加调色板工具,可以很方便地为数据搭配颜色。
  • 单变量和双变量分布绘图更为简单,可用于对数据子集相互比较。
  • 对独立变量和相关变量进行回归拟合和可视化更加便捷。
  • 对数据矩阵进行可视化,并使用聚类算法进行分析。
  • 基于时间序列的绘制和统计功能,更加灵活的不确定度估计。
  • 基于网格绘制出更加复杂的图像集合。

        除此之外, Seaborn 对 Matplotlib 和 Pandas 的数据结构高度兼容 ,非常适合作为数据挖掘过程中的可视化工具

快速优化图形

        当我们使用 Matplotlib 绘图时,默认的图像样式算不上美观。此时,就可以使用 Seaborn 完成快速优化。下面,我们先使用 Matplotlib 绘制一张简单的图像。

import matplotlib.pyplot as plt
%matplotlib inline

x = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
y_bar = [3, 4, 6, 8, 9, 10, 9, 11, 7, 8]
y_line = [2, 3, 5, 7, 8, 9, 8, 10, 6, 7]

plt.bar(x, y_bar)
plt.plot(x, y_line, '-o', color='y')

         使用 Seaborn 完成图像快速优化的方法非常简单。只需要将 Seaborn 提供的样式声明代码 sns.set() 放置在绘图前即可。

import seaborn as sns

sns.set()  # 声明使用 Seaborn 样式

plt.bar(x, y_bar)
plt.plot(x, y_line, '-o', color='y')

 

         我们可以发现,相比于 Matplotlib 默认的纯白色背景,Seaborn 默认的浅灰色网格背景看起来的确要细腻舒适一些。而柱状图的色调、坐标轴的字体大小也都有一些变化。

sns.set() 的默认参数为:

sns.set(context='notebook', style='darkgrid', palette='deep', font='sans-serif', font_scale=1, color_codes=False, rc=None)

其中:

  • context='' 参数控制着默认的画幅大小,分别有 {paper, notebook, talk, poster} 四个值。其中,poster > talk > notebook > paper
  • style='' 参数控制默认样式,分别有 {darkgrid, whitegrid, dark, white, ticks},你可以自行更改查看它们之间的不同。
  • palette='' 参数为预设的调色板。分别有 {deep, muted, bright, pastel, dark, colorblind} 等,你可以自行更改查看它们之间的不同。
  • font='' 用于设置字体,font_scale= 设置字体大小color_codes= 不使用调色板而采用先前的 'r' 等色彩缩写

Seaborn 绘图 API

        Seaborn 一共拥有 50 多个 API 类,相比于 Matplotlib 数千个的规模,可以算作是短小精悍了。其中,根据图形的适应场景,Seaborn 的绘图方法大致分类 6 类,分别是:关联图、类别图、分布图、回归图、矩阵图和组合图。而这 6 大类下面又包含不同数量的绘图函数。

        接下来,我们就通过实际数据进行演示,使用 Seaborn 绘制不同适应场景的图形。

关联图

        当我们需要对数据进行关联性分析时,可能会用到 Seaborn 提供的以下几个 API。

关联性分析介绍
relplot绘制关系图
scatterplot多维度分析散点图
lineplot多维度分析线形图

        relplot 是 relational plots 的缩写,其可以用于呈现数据之后的关系,主要有散点图和条形图 2 种样式。本次实验,我们使用鸢尾花数据集进行绘图探索。

        在绘图之前,先熟悉一下 iris 鸢尾花数据集。数据集总共 150 行,由 5 列组成。分别代表:萼片长度、萼片宽度、花瓣长度、花瓣宽度、花的类别。其中,前四列均为数值型数据,最后一列花的分类为三种,分别是:Iris Setosa、Iris Versicolour、Iris Virginica。

# 从国内镜像下载 seaborn 数据集避免下一步加载数据集失败
!wget -nc "https://labfile.oss.aliyuncs.com/courses/2616/seaborn-data.zip"
!unzip seaborn-data.zip -d ~/

iris = sns.load_dataset("iris")
iris.head()
sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
05.13.51.40.2setosa
14.93.01.40.2setosa
24.73.21.30.2setosa
34.63.11.50.2setosa
45.03.61.40.2setosa

 此时,我们指定 x 和 y 的特征,默认可以绘制出散点图。

一、散点图:

replot出的图默认为散点图。画散点图时relplot(kind=“scatter”)中的 kind=“scatter”可以省略。

sns.relplot(x="sepal_length", y="sepal_width", data=iris)

         但是,上图并不能看出数据类别之间的联系,如果我们加入类别特征对数据进行着色hue="species"就更好一些了。

参数hue

hue:用不同的颜色区分出来

sns.relplot(x="sepal_length", y="sepal_width", hue="species", data=iris)

hue+ hue_order

        可以通过hue_order(一个list)来控制图例中hue的顺序。如果不设置的话,就会自动根据data来进行设定。
        如果hue是数字型连续值,hue_order就没有什么关系了。

参数style 

style:不同的表示形状上区分 

sns.relplot(x="sepal_length", y="sepal_width",
            hue="species", style="species", data=iris)

 

        style 参数可以赋予不同类别的散点不同的形状(style="species"。更多的参数,希望大家通过阅读官方文档了解。  

二 、线形图

         不只是散点图,该方法还支持线形图,只需要指定 kind="line" 参数即可。线形图和散点图适用于不同类型的数据线形态绘制时还会自动给出 95% 的置信区间

sns.relplot(x="sepal_length", y="petal_length",
            hue="species", style="species", kind="line", data=iris)

         你会发现,上面我们一个提到了 3 个 API,分别是:relplotscatterplot 和 lineplot。实际上,你可以把我们已经练习过的 relplot 看作是 scatterplot 和 lineplot 的结合版本。

        这里就要提到 Seaborn 中的 API 层级概念,Seaborn 中的 API 分为 Figure-level 和 Axes-level 两种。relplot 就是一个 Figure-level 接口,而 scatterplot 和 lineplot 则是 Axes-level 接口。

        Figure-level 和 Axes-level API 的区别在于,Axes-level 的函数可以实现与 Matplotlib 更灵活和紧密的结合,而 Figure-level 则更像是「懒人函数」,适合于快速应用。

        例如上方的图,我们也可以使用 lineplot 函数绘制,你只需要取消掉 relplot 中的 kind 参数即可。

sns.lineplot(x="sepal_length", y="petal_length",
             hue="species", style="species", data=iris)

 

三、类别图

        与关联图相似,类别图的 Figure-level 接口是 catplot其为 categorical plots 的缩写。而 catplot 实际上是如下 Axes-level 绘图 API 的集合:

下面,我们看一下 catplot 绘图效果。该方法默认是绘制 kind="strip" 散点图。

sns.catplot(x="sepal_length", y="species", data=iris)

   kind="swarm" 可以让散点按照 beeswarm 的方式防止重叠,可以更好地观测数据分布。

sns.catplot(x="sepal_length", y="species", kind="swarm", data=iris)

         同理,hue= 参数可以给图像引入另一个维度,由于 iris 数据集只有一个类别列,我们这里就不再添加 hue= 参数了。如果一个数据集有多个类别,hue= 参数就可以让数据点有更好的区分。

        接下来,我们依次尝试其他几种图形的绘制效果。

绘制箱线图

sns.catplot(x="sepal_length", y="species", kind="box", data=iris)

绘制小提琴图

sns.catplot(x="sepal_length", y="species", kind="violin", data=iris)

绘制增强箱线图

sns.catplot(x="species", y="sepal_length", kind="boxen", data=iris)

绘制点线图

sns.catplot(x="sepal_length", y="species", kind="point", data=iris)

绘制条形图

sns.catplot(x="sepal_length", y="species", kind="bar", data=iris)

绘制计数条形图

sns.catplot(x="species", kind="count", data=iris)

四、分布图

        分布图主要是用于可视化变量的分布情况,一般分为单变量分布和多变量分布。当然这里的多变量多指二元变量,更多的变量无法绘制出直观的可视化图形。

        Seaborn 提供的分布图绘制方法一般有这几个: jointplotpairplotdistplotkdeplot接下来,我们依次来看一下这些绘图方法的使用。

        Seaborn 快速查看单变量分布的方法是 distplot。默认情况下,该方法将会绘制直方图并拟合核密度估计图。

sns.distplot(iris["sepal_length"])

   distplot 提供了参数来调整直方图和核密度估计图,例如设置 kde=False 则可以只绘制直方图,或者 hist=False 只绘制核密度估计图。当然,kdeplot 可以专门用于绘制核密度估计图,其效果和 distplot(hist=False) 一致,但 kdeplot 拥有更多的自定义设置

sns.kdeplot(iris["sepal_length"])

  jointplot 主要是用于绘制二元变量分布图。例如,我们探寻 sepal_length 和 sepal_width 二元特征变量之间的关系。 

sns.jointplot(x="sepal_length", y="sepal_width", data=iris)

   jointplot 并不是一个 Figure-level 接口,但其支持 kind= 参数指定绘制出不同样式的分布图。例如,绘制出核密度估计对比图。

sns.jointplot(x="sepal_length", y="sepal_width", data=iris, kind="kde")

 六边形计数图:

sns.jointplot(x="sepal_length", y="sepal_width", data=iris, kind="hex")

 回归拟合图:

sns.jointplot(x="sepal_length", y="sepal_width", data=iris, kind="reg")

         最后要介绍的 pairplot 更加强大,其支持一次性将数据集中的特征变量两两对比绘图。默认情况下,对角线上是单变量分布图,而其他则是二元变量分布图。

sns.pairplot(iris)

 此时,我们引入第三维度 hue="species" 会更加直观。

sns.pairplot(iris, hue="species")

五、回归图

        接下来,我们继续介绍回归图,回归图的绘制函数主要有:lmplot 和 regplot

regplot 绘制回归图时,只需要指定自变量和因变量即可,regplot 会自动完成线性回归拟合

sns.regplot(x="sepal_length", y="sepal_width", data=iris)

   lmplot 同样是用于绘制回归图,但 lmplot 支持引入第三维度进行对比,例如我们设置 hue="species"

sns.lmplot(x="sepal_length", y="sepal_width", hue="species", data=iris)

六、矩阵图

        矩阵图中最常用的就只有 2 个,分别是heatmap  clustermap

        意如其名,heatmap 主要用于绘制热力图。

import numpy as np

sns.heatmap(np.random.rand(10, 10))

         热力图在某些场景下非常实用,例如绘制出变量相关性系数热力图。

        除此之外,clustermap 支持绘制  层次聚类 结构图。如下所示,我们先去掉原数据集中最后一个目标列,传入特征数据即可。当然,你需要对层次聚类有所了解,否则很难看明白图像表述的含义。

iris.pop("species")
sns.clustermap(iris)

         如果你浏览官方文档,就会发现 Seaborn 中还存在大量已大写字母开始的类,例如 JointGridPairGrid 等。实际上这些类只是其对应小写字母的函数 jointplotpairplot 的进一步封装。当然,二者可能稍有不同,但并没有本质的区别。

        除此之外, Seaborn 官方文档 中还有关于  样式控制 和  色彩自定义 等一些辅助组件的介绍。对于这些 API 的应用没有太大的难点,重点需要勤于练习。

课后习题

请使用 Seaborn 对示例数据集 tips = sns.load_dataset("tips") 进行数据可视化探索。

答案:可以参考以下两篇文章

详细的数据可视化库之Seaborn教程(一)——relplot:关系图(可视化统计量间的关系)

详细的数据可视化库之Seaborn教程(二)——catplot:分类型数据作坐标轴画图

实验总结

        本章节对 Seaborn 的用法进行了简单的介绍。这里需要说明一下 Seaborn 和 Matplotlib 之间的关系,Seaborn 并不是为了替代 Matplotlib,而应当被看作是 Matplotlib 的补充。对于 Matplotlib 而言,它具有高度自定义属性,可以实现任何你想要的效果。而 Seaborn 非常简单快捷,几行代码就可以画出还不赖的图形。总之,Matplotlib 擅长于纯粹的绘图,而 Seaborn 则多用于数据可视化探索。

1. 目录 1. 目录 2 2. 绘图函数Plotting functions 4 2.1. 可视化的统计关系Visualizing statistical relationships 4 2.1.1. 用散点图联系变量Relating variables with scatter plots 4 2.1.2. 强调线条图的连续性Emphasizing continuity with line plots 10 2.1.3. 显示与切面的多个关系Showing multiple relationships with facets 21 2.2. 分类数据绘图Plotting with categorical data 24 2.2.1. 分类散点图Categorical scatterplots 26 2.2.2. 分类观测值分布Distributions of observations within categories 31 2.2.3. 分类统计估计Statistical estimation within categories 37 2.2.4. 对“wide-form”数据作图Plotting “wide-form” data 41 2.2.5. 显示与facet的多个关系Showing multiple relationships with facets 43 2.3. 可视化数据集的分布Visualizing the distribution of a dataset 44 2.3.1. 绘制单变量分布Plotting univariate distributions 45 2.3.2. 绘制二元分布Plotting bivariate distributions 51 2.3.3. 在数据集中可视化成对关系Visualizing pairwise relationships in a dataset 55 2.4. 可视化线性关系Visualizing linear relationships 57 2.4.1. 函数绘制线性模型Functions to draw linear regression models 58 2.4.2. 拟合不同种类的模型Fitting different kinds of models 61 2.4.3. 在其他变量上的情况Conditioning on other variables 68 2.4.4. 控制图表的大小和形状Controlling the size and shape of the plot 71 2.4.5. 在其他上下文中绘制回归图Plotting a regression in other contexts 73 3. 多图网格Multi-plot grids 76 3.1. 构建结构化的多图网格Building structured multi-plot grids 76 3.2. 有条件的小倍数Conditional small multiples 77 3.3. 使用定制函数Using custom functions 86 3.4. 绘制成对的数据关系Plotting pairwise data relationships 90 4. 绘图美学Plot aesthetics 99 4.1. 控制图表美学Controlling figure aesthetics 99 4.1.1. Seaborn图表风格Seaborn figure styles 101 4.1.2. 删除轴上的小凸起Removing axes spines 104 4.1.3. 临时设置图表样式Temporarily setting figure style 105 4.1.4. 覆盖Seaborn样式的元素Overriding elements of the seaborn styles 106 4.1.5. 缩放图表元素Scaling plot elements 108 4.2. 选择调色板Choosing color palettes 111 4.2.1. 创建颜色调色板Building color palettes 111 4.2.2. 定性调色板Qualitative color palettes 112 4.2.3. 连续调色板Sequential color palettes 116 4.2.4. 不同颜色的调色板Diverging color palettes 122 4.2.5. 设置默认调色板Setting the default color palette 124 5. 教程中的数据集 125
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小叶pyか

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值