第126天:Seaborn-可视化统计关系

简介: 第126天:Seaborn-可视化统计关系

大数据一直是近几年来比较火爆的方向,作为想接触大数据的你,就不得不了解 seaborn。它是当下 Python 非常流行的数据可视化库,可以绘制出美观且有价值的图形。用一句话总结就是对于大数据从业人员来说,具备数据可视化的能力非常重要的,因为我们面对的客户或上司将更多地依赖于视觉提示,而不是复杂的机器学习模型。


1 前言


1.1 什么是 seaborn ?


seaborn 是基于 matplotlib 库封装而成的一个数据可视化库。相比于 matplotlib 库,seaborn 的操作更加简单方便,具有更高级的接口。它使我们能够创建放大的数据视觉效果,帮助我们理解数据,通过在可视上下文中显示数据来发现变量或趋势之间的任何隐藏相关性,而这些相关性最初可能并不明显。


1.2 seaborn 环境搭建


个人建议安装 annoconda 软件,清华镜像 annoconda 下载地址,安装好即可以使用 seaborn 等一些库了,简单方便。


1.3 本文内容


本文将介绍如何用 seaborn 进行绘制可视化图形,主要采用以下三个函数:


  • replot(),这是在绘图过程中最常用的一个函数,默认是绘制散点图。
  • scatterplot(),顾名思义,这个函数作用是绘制散点图,作用类似 replot(kind="scatter")。
  • lineplot(),绘制线图,作用类似 replot(kind="line")。


使用这些函数时可以通过色调、大小和样式的语义映射最多三个额外的变量来增强绘制的二维图形。简单来说就是函数的功能简单灵活,可以表示复杂的数据集结构。下面将通过例子逐一展示。


使用 seaborn 时一般需要 numpy、pandas 以及 matplotlib 库配合使用:


import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snssns.set(style="darkgrid") # 设置 seaborn 的绘图样式,可以有 “darkgrid、whitegrid、dark、white 和 ticks” 样式。


2 散点图绘制


散点图是统计学中主要的可视化图形之一,由点汇聚成云图,每个点代表统计数据集中的一个观测值,通过云图可以推断出许多信息,进而判断两个变量之间是否存在一些有意义的联系。


在以下每个示例中,我们采用的是库里面自带的小费数据集 “tips”,通过以下代码来了解一下数据集的内容,可以看出 "tips" 包含了7个变量,分别是总账单、小费、顾客性别、是否吸烟、日期、吃饭时间以及顾客人数。


tips= sns.load_dataset("tips")print('tips 数据集前十行数据:\n', tips.head(5))print('每一列的数据类型:\n', tips.dtypes)#输出结果:#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#每一列的数据类型:# total_bill     float64#tip            float64#sex           category#smoker        category#day           category#time          category#size             int64#dtype: object


2.1 示例1


# 输出 tips 数据集中以 total_bill 变量为 x 轴,tip 变量为 y 轴的散点图,注意 replot() 绘制出的图默认就是散点图sns.relplot(x="total_bill", y="tip", data=tips)


image.png


根据可视化的图形可以大致得出顾客给的小费与总账单之间的一些关系,比如消费高的给的小费也越高。


2.2 示例2


虽然示例1中这些点以二维的形式描述了两个变量之间的联系,但还可以通过第三个变量对点进行着色来将另一个维度添加到绘图中。在 seaborn 中,这被称为使用“色调语义”,因为该点的颜色获得了意义:


# hue 参数用来输入定义色调语义的变量,即增加新的维度 smoker 变量sns.relplot(x="total_bill", y="tip", hue="smoker", data=tips)


image.png


根据图上所示可知有3个维度的信息:total_bill、tip 以及 smoker(Yes:蓝色,No:橙色)。


2.3 示例3


为了强调类别之间的差异并提高辨识度,可以为每个类别使用不同的标记样式,引入 style 参数:


# style 参数用来输入定义样式的变量,这里仍然输入 smoker 变量sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker", data=tips


image.png


根据图上所示可知有3个维度的信息:total_bill、tip 以及 smoker(Yes:蓝色圆圈,No:橙色叉叉)。


2.4 示例4


可视化图形可以表示四个维度的信息,通过单独改变每个点的色调和样式来表示四个变量。但是人眼对形状的敏感度远低于对颜色的敏感度,建议谨慎使用:


# style 参数输入 time 变量sns.relplot(x="total_bill", y="tip", hue="smoker", style="time", data=tips)


image.png


图中表示了四个维度的信息:total_bill、tip、smoker(Yes:蓝色,No:橙色)以及 time(Lunch:圆圈,Dinner:叉叉)。'


2.5 示例5


在上面的例子中,因为 smoker 变量表示的是类别,所以色调语义 hue 参数在可视化图形中以两种颜色区分表示类别,即使用了默认的定性调色板。如果色调语义 hue 参数填入的变量表示的是数值,则默认的颜色会切换到顺序调色板:


# size 变量表示的是数值大小,不再是类别sns.relplot(x="total_bill", y="tip", hue="size", data=tips)


image.png


图中通过颜色深浅表示每个点代表的顾客人数大小,颜色越深表示的顾客人数越多。


2.6 示例6


通过引入 size 参数,来改变每个点的大小:


#sns.relplot(x="total_bill", y="tip", size="size", data=tips)


image.png


图中点的形状越大代表的顾客人数越多。


我们还可以通过引入 sizes 参数,来表示每个点的大小变化范围:


# sizes 中表示每个点的面积大小,最小值15,最大值200sns.relplot(x="total_bill", y="tip", size="size", sizes=(15, 200), data=tips)


image.png


3 线图绘制


虽然散点图是一种非常有效的数据可视化图形,但他并不是对所有数据都通用的。绘制可视化图形时,应该根据数据集的内容以及试图用图形回答的问题。针对某些数据集,我们可能希望了解一个变量的随时间的变化关系。在这种情况下,根据数据集来绘制线图是一个不错的选择。在 seaborn 中,我们可以通过 lineplot() 函数直接绘制线图,也可以通过设置 relplot() 的参数 kind="line" 来实现。


3.1 示例1


# 定义一个数据集 df,绘制 value 变量关于 time 变量的函数df = pd.DataFrame(dict(time=np.arange(500), value=np.random.randn(500).cumsum()))sns.relplot(x="time", y="value", kind="line", data=df)


image.png


# 想要将 y 绘制为 x 的函数,默认行为是在绘制之前按数字 x 对数据进行排序。但是,可以通过设置 sort 参数值来禁用:df = pd.DataFrame(np.random.randn(500, 2).cumsum(axis=0), columns=["x", "y"])sns.relplot(x="x", y="y", sort=False, kind="line", data=df)


image.png


3.2 示例2


有一些复杂的数据集将对 x 变量的相同值有多个观测值。seaborn 的默认行为是通过绘制平均值及 95% 的置信区间,在每个 x 周围聚合多个测量值。


示例中我们采用的是库里面自带的数据集 "fmri",通过以下代码来了解一下数据集的内容,可以看出 "fmri" 包含了5个变量,分别是subject、timepoint、event、region 和 signal。


fmri = sns.load_dataset("fmri")print(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


# 绘制 signal 变量关于 timepoint 变量的函数,包括 95% 的置信区间sns.relplot(x="timepoint", y="signal", kind="line", data=fmri)


image.png


image.png


image.png


image.png


image.png


image.png


3.3 示例3


本示例中我们采用的是库里面自带的数据集 “dots”,通过以下代码来了解一下数据集的内容,可以看出 "dots" 包含了5个变量,分别是align、choice、time、coherence 和 firing_rate。


dots = sns.load_dataset("dots").query("align == 'dots'")print(dots)
# 输出结果:#     align choice  time  coherence  firing_rate# 0    dots     T1   -80        0.0    33.189967# 1    dots     T1   -80        3.2    31.691726# 2    dots     T1   -80        6.4    34.279840# 3    dots     T1   -80       12.8    32.631874# 4    dots     T1   -80       25.6    35.060487# ..    ...    ...   ...        ...          ...# 389  dots     T2   680        3.2    37.806267# 390  dots     T2   700        0.0    43.464959# 391  dots     T2   700        3.2    38.994559# 392  dots     T2   720        0.0    41.987121# 393  dots     T2   720        3.2    41.716057


# 之前的示例中我们添加的参数 hue 中定义的变量都是类别,接下来我们通过一个例子来看当该参数定义的变量是数值时会产生什么样的效果sns.relplot(x="time", y="firing_rate",             hue="coherence", style="choice",             kind="line", data=dots)


如图所示,coherence 中以四个层级深浅不一的颜色表示该变量数值大小。


image.png


image.png


image.png


3.4 示例4

线图通常用于可视化与实际日期和时间相关的数据。



df = pd.DataFrame(dict(time=pd.date_range("2017-1-1", periods=500),                       value=np.random.randn(500).cumsum()))g = sns.relplot(x="time", y="value", kind="line", data=df)

如下图所示,x 坐标产生乱码,影响了图形的可读性。


image.png


image.png


4 显示多图-格点图


因为 relplot() 是基于 FacetGrid,所以很容易显示附加变量的影响,而不是将其分配给图中的一个语义角色。这意味着可以创建多个轴并在每个轴上绘制数据的子集。


4.1 示例


# 以 tips 数据集为例,添加 col 参数为 time 变量,在行上按照 time 变量进行分列tips = sns.load_dataset("tips")sns.relplot(x="total_bill", y="tip", hue="smoker",            col="time", data=tips)


image.png


image.png


image.png


总结

本节给大家介绍了 seaborn 中关于散点图、线图以及格点图的绘制方式,助你掌握统计数据中各变量间关系可视化表示的一些基本方法。

目录
相关文章
|
1月前
|
数据采集 数据可视化 数据挖掘
基于Python的数据分析与可视化实战
本文将引导读者通过Python进行数据分析和可视化,从基础的数据操作到高级的数据可视化技巧。我们将使用Pandas库处理数据,并利用Matplotlib和Seaborn库创建直观的图表。文章不仅提供代码示例,还将解释每个步骤的重要性和目的,帮助读者理解背后的逻辑。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供有价值的见解和技能。
91 0
|
4天前
|
移动开发 数据可视化 数据挖掘
利用Python实现数据可视化:以Matplotlib和Seaborn为例
【10月更文挑战第37天】本文旨在引导读者理解并掌握使用Python进行数据可视化的基本方法。通过深入浅出的介绍,我们将探索如何使用两个流行的库——Matplotlib和Seaborn,来创建引人入胜的图表。文章将通过具体示例展示如何从简单的图表开始,逐步过渡到更复杂的可视化技术,帮助初学者构建起强大的数据呈现能力。
|
1月前
|
机器学习/深度学习 数据可视化 Python
Python实用记录(三):通过netron可视化模型
使用Netron工具在Python中可视化神经网络模型,包括安装Netron、创建文件和运行文件的步骤。
29 2
Python实用记录(三):通过netron可视化模型
|
24天前
|
数据可视化 数据挖掘 Python
Seaborn 库创建吸引人的统计图表
【10月更文挑战第11天】本文介绍了如何使用 Seaborn 库创建多种统计图表,包括散点图、箱线图、直方图、线性回归图、热力图等。通过具体示例和代码,展示了 Seaborn 在数据可视化中的强大功能和灵活性,帮助读者更好地理解和应用这一工具。
36 3
|
8天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据分析和可视化
【10月更文挑战第33天】本文将介绍如何使用Python编程语言进行数据分析和可视化。我们将从数据清洗开始,然后进行数据探索性分析,最后使用matplotlib和seaborn库进行数据可视化。通过阅读本文,你将学会如何运用Python进行数据处理和可视化展示。
|
1月前
|
数据采集 Web App开发 数据可视化
Python爬虫教程:Selenium可视化爬虫的快速入门
Python爬虫教程:Selenium可视化爬虫的快速入门
|
1月前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
39 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
28天前
|
数据采集 数据可视化 数据挖掘
使用Python进行数据处理与可视化——以气温数据分析为例
【10月更文挑战第12天】使用Python进行数据处理与可视化——以气温数据分析为例
168 0
|
1月前
|
数据可视化 Serverless Python
Python小事例—质地不均匀的硬币的概率统计
Python小事例—质地不均匀的硬币的概率统计
|
1月前
|
数据采集 数据可视化 数据挖掘
Python 数据分析实战:使用 Pandas 进行数据清洗与可视化
【10月更文挑战第3天】Python 数据分析实战:使用 Pandas 进行数据清洗与可视化
83 0