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

简介: 本次将主要介绍 分类数据可视化的使用。

Seaborn学习大纲

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

1. 风格管理

绘图风格设置:Seaborn从零开始学习教程(一)

颜色风格设置:Seaborn从零开始学习教程(二)

2. 绘图方法

数据集的分布可视化:Seaborn从零开始学习教程(三)

分类数据可视化

线性关系可视化

3. 结构网格

数据识别网格绘图


本次将主要介绍 分类数据可视化的使用。

分类数据可视化

数据集中的数据类型有很多种,除了连续的特征变量之外,最常见的就是类目型的数据类型了,常见的比如人的性别,学历,爱好等。这些数据类型都不能用连续的变量来表示,而是用分类的数据来表示。

seaborn针对分类型的数据有专门的可视化函数,这些函数可大致分为三种:

分类数据散点图: swarmplot(), stripplot()

分类数据的分布图: boxplot(), violinplot()

分类数据的统计估算图 : barplot(), pointplot()

这三类函数可有特点,可以从各个方面展示分类数据的可视化效果,下面我们一一介绍。首先的首先还是先导入需要的模块和数据集。

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="whitegrid", color_codes=True)
np.random.seed(sum(map(ord, "categorical")))
titanic = sns.load_dataset("titanic")
tips = sns.load_dataset("tips")
iris = sns.load_dataset("iris")

分类数据散点图

在分类数据的基础上展示定量数据的最简单函数就是 stripplot()。

sns.stripplot(x="day", y="total_bill", data=tips);

微信图片_20220217221026.jpg

这看上去类似散点图,但不同的是,横坐标是分类的数据,只不过一些数据点上会互相重叠,不便于观察。所以一个简单的解决办法是加入 jitter 参数,调整横坐标位置。


sns.stripplot(x="day", y="total_bill", data=tips, jitter=True);

微信图片_20220217221049.jpg

当然,还有一个不同的方法就是使用 swarmplot() 函数,这个函数的好处就是所有的点都不会重叠,这样可以很清晰的观察到数据的分布。

微信图片_20220217221106.jpg

sns.swarmplot(x="day", y="total_bill", data=tips);

微信图片_20220217221230.jpg

通常情况下,seaborn 还会尝试推断出分类变量的顺序。如果你的数据是 pandas 的分类数据类型,那么就是使用默认的分类数据顺序,如果是其他的数据类型,字符串类型的类别将按照它们在DataFrame中显示的顺序进行绘制,但是数组类别将被排序:

微信图片_20220217221348.jpg

有时候将分类变量放在垂直轴上是非常有用的(当类别名称相对较长或有很多类别时,这一点特别有用)。 可以使用 orient 关键字强制定向,但通常可以互换x和y的变量的数据类型来完成:

sns.swarmplot(x="total_bill", y="day", hue="time", data=tips);

微信图片_20220217221416.jpg

分类数据分布图


虽然分类的散点图很有用,但有时候想要快速查看各分类下的数据分布就不是很直观了。为此,第二种函数解决了这个问题。

箱型图

通过箱型图可以很直观的观察到数据的四分位分布(1/4分位,中位数,3/4分位,以及四分位距),这种可视化对于在机器学习的预处理阶段(尤其是发现数据异常离散值)十分有效。

sns.boxplot(x="day", y="total_bill", hue="time", data=tips);

微信图片_20220217221435.jpg

对于箱型图来说,使用 hue 参数的假设是这个变量嵌套在x或者y轴内。所以默认的情况下,hue 变量的不同类型值会保持偏置状态(两类或几类数据共同在x轴数据类型的一个类中),就像上面那个图所示。但是如果 hue 所使用的变量不是嵌套的,那么你可以使用 dodge 参数来禁止这个默认的偏置状态。

tips["weekend"] = tips["day"].isin(["Sat", "Sun"])
sns.boxplot(x="day", y="total_bill", hue="weekend", data=tips, dodge=False);

微信图片_20220217221455.jpg

提琴图

另一种不同的方法是 violinplot() 函数,它结合了箱体图和分布教程中描述的核心密度估计过程:

sns.violinplot(x="total_bill", y="day", hue="time", data=tips);

微信图片_20220217221611.jpg

这种方法使用核密度估计来更好地描述值的分布。此外,小提琴内还显示了箱体四分位数和四分位距。由于小提琴使用KDE,还有一些其他可以调整的参数,相对于简单的boxplot增加了一些复杂性:

sns.violinplot(x="total_bill", y="day", hue="time", data=tips,
               bw=.1, scale="count", scale_hue=False);

微信图片_20220217221635.jpg

hue 的嵌套类型只有两类的时候,也可以使用 split 参数将小提琴分割:

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True);

微信图片_20220217221657.jpg

在提琴图内,也可以使用 inner 参数以横线的形式来展示每个观察点的分布,来代替箱型的整体分布:

sns.violinplot(x="day", y="total_bill", hue="sex", data=tips,
               split=True, inner="stick", palette="Set3");

微信图片_20220217221715.jpg

还有一点比较好的是,可以将 swarmplot()violinplot(),或 boxplot() 混合使用,这样可以结合多种绘图的特点展示更完美的效果。

sns.violinplot(x="day", y="total_bill", data=tips, inner=None)
sns.swarmplot(x="day", y="total_bill", data=tips, color="w", alpha=.5);

微信图片_20220217221743.jpg

分类数据统计估计图

有时候,我们不想展示分类数据下的分布,而是想展示每一类的集中趋势。seaborn 有两个主要的方法来展示这个,并且这些函数api与上面函数的用法是一样的。

条形图

我们最熟悉的方式就是使用一个条形图。 在Seaborn中 barplot() 函数会在整个数据集上显示估计,默认情况下使用均值进行估计。 当在每个类别中有多个类别时(使用了 hue),它可以使用引导来计算估计的置信区间,并使用误差条来表示置信区间:

sns.barplot(x="sex", y="survived", hue="class", data=titanic);

微信图片_20220217221805.jpg

条形图的特殊情况是当您想要显示每个类别的数量,而不是计算统计量。这有点类似于一个分类而不是定量变量的直方图。在Seaborn中,使用 countplot() 函数很轻易的完成:

sns.countplot(x="deck", data=titanic, palette="Greens_d");

微信图片_20220217221824.jpg

如果将要计数的变量移动到y轴上,那么条形就会横过来显示:

sns.countplot(y="deck", hue="class", data=titanic, palette="Greens_d");

微信图片_20220217221842.jpg

点图

pointplot() 函数提供了估计可视化的另一种风格。该函数会用高度估计值对数据进行描述,而不是显示一个完整的条形,它只绘制点估计和置信区间。另外,点图连接相同hue类别的点,比如male中的蓝色会连接female中的蓝色。这使得很容易看出主要关系如何随着第二个变量的变化而变化,因为你的眼睛可以很好地辨别斜率的差异:

sns.pointplot(x="sex", y="survived", hue="class", data=titanic);

微信图片_20220217221901.jpg

为了使能够更好的显示,可以使用不同的标记和线条样式来展示不同 hue 类别的层次:

sns.pointplot(x="class", y="survived", hue="sex", data=titanic,
              palette={"male": "g", "female": "m"},
              markers=["^", "o"], linestyles=["-", "--"]);

微信图片_20220217221920.jpg


绘制宽格式数据

虽然使用“长格式”或“整洁”数据是优选的,但是这些函数也可以应用于各种格式的“宽格式”数据,包括pandas DataFrame或二维numpy数组阵列。这些对象应该直接传递给数据参数:

sns.boxplot(data=iris, orient="h");

微信图片_20220217221938.jpg

此外,这些函数也接受Pandas或numpy对象的向量,而不仅仅是DataFrame中的变量:

sns.violinplot(x=iris.species, y=iris.sepal_length);

微信图片_20220217222036.jpg

为了控制由上述函数制作的图形的大小和形状,你必须使用matplotlib命令自己设置图形。 当然,这也意味着这些图块可以和其他种类的图块一起在一个多面板的绘制中共存:

f, ax = plt.subplots(figsize=(7, 3))
sns.countplot(y="deck", data=titanic, color="c");

微信图片_20220217222058.jpg

绘制多层面板分类图


正如我们上面提到的,有两种方法可以在Seaborn中绘制分类图。与回归图中的二元性相似,您可以使用上面介绍的函数,也可以使用更高级别的函数factorplot(),将这些函数与 FacetGrid() 相结合,通过这个图形的更大的结构来增加展示其他类别的能力。 默认情况下,factorplot() 产生一个 pairplot()

sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips);

微信图片_20220217222116.jpg

但是,kind 参数可以让你选择以上讨论的任何种类的图:

sns.factorplot(x="day", y="total_bill", hue="smoker", data=tips, kind="bar");

微信图片_20220217222132.jpg

使用 factorplot() 的主要优点是可以很容易使用 "facet" 绘制多面图,展示更多其他分类变量:

sns.factorplot(x="day", y="total_bill", hue="smoker",
               col="time", data=tips, kind="swarm");

微信图片_20220217222151.jpg

任何一种图形都可以画出来。由于 FacetGrid 的工作原理,要更改图形的大小和形状,需要指定适用于每个图的 sizeaspect 参数:

sns.factorplot(x="time", y="total_bill", hue="smoker",
               col="day", data=tips, kind="box", size=4, aspect=.5);

微信图片_20220217222208.jpg

你也可以直接使用 boxplot() 和 FacetGrid 来制作这个图。但是,必须特别注意确保每个图的分类变量的顺序需要被强制,或者是使用具有Categorical数据类型的数据或通过命令和 hue_order

sns.factorplot(x="time", y="total_bill", hue="smoker",hue_order=["No","Yes"]
               ,col="day", data=tips, kind="box", size=4, aspect=.5,
              palette="Set3");

微信图片_20220217222223.jpg

由于通用API函数的存在,分类数据也可以很容易应用于其他更复杂的上下文。 例如,它们可以轻松地与 PairGrid 结合,以显示多个不同变量之间的分类关系:

g = sns.PairGrid(tips,
                 x_vars=["smoker", "time", "sex"],
                 y_vars=["total_bill", "tip"],
                 aspect=.75, size=3.5)
g.map(sns.violinplot, palette="pastel");

微信图片_20220217222242.jpg

http://seaborn.pydata.org/tutorial/categorical.html


相关文章
|
20天前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
2天前
|
数据可视化 数据挖掘 大数据
1.1 学习Python操作Excel的必要性
学习Python操作Excel在当今数据驱动的商业环境中至关重要。Python能处理大规模数据集,突破Excel行数限制;提供丰富的库实现复杂数据分析和自动化任务,显著提高效率。掌握这项技能不仅能提升个人能力,还能为企业带来价值,减少人为错误,提高决策效率。推荐从基础语法、Excel操作库开始学习,逐步进阶到数据可视化和自动化报表系统。通过实际项目巩固知识,关注新技术,为职业发展奠定坚实基础。
|
11天前
|
Python
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
|
22天前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
22天前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
20天前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
22天前
|
索引 Python
Python学习的自我理解和想法(5)
这是我在B站千锋教育学习Python的第五天笔记,主要内容包括列表的操作,如排序(`sort()`、``sorted()``)、翻转(`reverse()`)、获取长度(`len()`)、最大最小值(`max()`、``min()``)、索引(`index()`)、嵌套列表和列表生成(`range`、列表生成式)。通过这些操作,可以更高效地处理数据。希望对大家有所帮助!
|
3月前
|
数据可视化 IDE 开发工具
【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
370 13
|
3月前
|
监控 数据可视化 搜索推荐
【Python篇】matplotlib超详细教程-由入门到精通(下篇)2
【Python篇】matplotlib超详细教程-由入门到精通(下篇)
49 8
|
3月前
|
数据可视化 API 数据处理
【Python篇】matplotlib超详细教程-由入门到精通(上篇)
【Python篇】matplotlib超详细教程-由入门到精通(上篇)
172 5