2. seaborn-可视化分类数据

seaborn中,有几种不同的方法可以对分类数据进行可视化。类似于relplot()scatterplot()或者lineplot()之间的关系,有两种方法可以制作这些图。有许多axes-level函数可以用不同的方式绘制分类数据,还有一个figure-level接口catplot(),可以对它们进行统一的高级访问。

将不同的分类图类型视为三个不同的家族,这是很有帮助的。下面我们将详细讨论,它们是:

分类散点图:

stripplot() (with kind="strip"; the default)

swarmplot() (with kind="swarm")

分类分布图:

boxplot() (with kind="box")

violinplot() (with kind="violin")

boxenplot() (with kind="boxen")

分类估计图:

pointplot() (with kind="point")

barplot() (with kind="bar")

countplot() (with kind="count")

这些家族使用不同的粒度级别来表示数据,我们应该根据实际情况来决定到底要使用哪个。它们有统一的 API,所以我们可以轻松地在不同类型之间进行切换,并从多个角度来观察数据。

在这里我们主要关注figure-level接口catplot()。这个函数是上述每个函数更高级别的接口,因此当我们显示每种绘图时都会引用它们,不清楚的话可以随时查看特定类型的API文档。

import seaborn as sns
import matplotlib.pyplot as plt
import warnings

warnings.filterwarnings('ignore')
sns.set(style="darkgrid", color_codes=True)

分类散点图

catplot()中,数据默认使用散点图表示。在seaborn中有两种不同的分类散点图,它们采用不同的方法来表示分类数据。 其中一种是属于一个类别的所有点,将沿着与分类变量对应的轴落在相同位置。stripplot()方法是catplot()kind的默认参数,它是用少量随机“抖动”调整分类轴上的点的位置:

tips = sns.load_dataset("tips")
sns.catplot(x="day", y="total_bill", hue='day', data=tips)
<seaborn.axisgrid.FacetGrid at 0x176a0eead50>

在这里插入图片描述

jitter参数控制抖动的大小,你也可以完全禁用它:

sns.catplot(x="day", y="total_bill", hue='day', jitter=False, data=tips)
<seaborn.axisgrid.FacetGrid at 0x176a0e91550>

在这里插入图片描述

另一种方法使用防止它们重叠的算法沿着分类轴调整点。我们可以用它更好地表示观测分布,但是只适用于相对较小的数据集。这种绘图有时被称为“beeswarm”,可以使用 seaborn中的swarmplot()绘制,通过在catplot()中设置kind="swarm"来激活

sns.catplot(x="day", y="total_bill", hue='day', kind="swarm", data=tips)
<seaborn.axisgrid.FacetGrid at 0x1769b5fa110>

在这里插入图片描述

与关系图类似,可以通过使用hue语义向分类图添加另一个维。(分类图当前不支持sizestyle语义 )。 每个不同的分类绘图函数以不同方式处理hue语义。对于散点图,我们只需要更改点的颜色:

sns.catplot(x="day", y="total_bill", hue="sex", kind="swarm", data=tips)
<seaborn.axisgrid.FacetGrid at 0x176a19d4c90>

在这里插入图片描述

与数值数据不同,如何沿着轴顺序排列分类变量并不总是显而易见的。通常,seaborn分类绘图函数试图从数据中推断出类别的顺序。 如果您的数据具有pandas中的Categorical数据类型,则可以在此处设置类别的默认顺序。如果传递给分类轴的变量看起来是数字,则将对级别进行排序。但是数据仍然被视为分类并在分类轴上的序数位置(特别是0,1,......)处理,即使用数字来标记它们:

sns.catplot(x="size", y="total_bill", kind="swarm", hue='size',
            data=tips.query("size != 3"))
<seaborn.axisgrid.FacetGrid at 0x176a0d18050>

在这里插入图片描述

选择默认排序的另一个选项是获取数据集中出现的类别级别。也可以使用order参数在特定图表的基础上控制排序。在同一图中绘制多个分类图时,这很重要,我们将在下面看到更多

sns.catplot(x="smoker", y="tip", order=["No", "Yes"], hue='smoker', data=tips)
<seaborn.axisgrid.FacetGrid at 0x176a0f80d50>

在这里插入图片描述

我们已经提到了“分类轴”的概念。在这些示例中,它始终对应于水平轴。但是将分类变量放在垂直轴上通常很有帮助(特别是当类别名称相对较长或有许多类别时)。为此,我们交换轴上的变量赋值:

sns.catplot(x="total_bill", y="day", hue="time", kind="swarm", data=tips)
<seaborn.axisgrid.FacetGrid at 0x176a1bcfd90>

在这里插入图片描述

类别内观察点的分布

随着数据集的大小增加,分类散点图中每个类别可以提供的值分布信息受到限制。当发生这种情况时,有几种方法可以总结分布信息,以便于我们可以跨分类级别进行简单比较。

箱线图

第一个是熟悉的boxplot()。它可以显示分布的三个四分位数值以及极值。“胡须”延伸到位于下四分位数和上四分位数的1.5 IQR内的点,超出此范围的观察值会独立显示。这意味着箱线图中的每个值对应于数据中的实际观察值。

sns.catplot(x="day", y="total_bill", kind="box", data=tips)
<seaborn.axisgrid.FacetGrid at 0x176a2e33ad0>

在这里插入图片描述

添加hue语义, 语义变量的每个级别的框沿着分类轴移动,因此它们将不会重叠:

sns.catplot(x="day", y="total_bill", hue="smoker", kind="box", data=tips)
<seaborn.axisgrid.FacetGrid at 0x20abaa98150>

在这里插入图片描述

此行为被称为“dodging”,默认开启,因为我们假定语义变量嵌套在主分类变量中。如果不是这样,可以禁用dodging

tips["weekend"] = tips["day"].isin(["Sat", "Sun"])
sns.catplot(x="day", y="total_bill", hue="weekend",
            kind="box", dodge=False, data=tips)
<seaborn.axisgrid.FacetGrid at 0x20abbc4fed0>

在这里插入图片描述

一个相关的函数boxenplot()可以绘制一个与Box-plot类似的图。它为了显示更多信息而对分布的形状进行了优化,比较适合于较大的数据集:

sns.catplot(x="day", y="total_bill", hue="smoker", kind="boxen", data=tips)
<seaborn.axisgrid.FacetGrid at 0x20abbcd5010>

在这里插入图片描述

小提琴图

另一种方法是violinplot(),它将箱线图与核密度估算程序结合起来:

sns.catplot(x="total_bill", y="day", hue="time",
            kind="violin", data=tips)
<seaborn.axisgrid.FacetGrid at 0x20abbf77ed0>

在这里插入图片描述

该方法使用核密度估计来提供更丰富的值分布描述。此外,violin中还显示了来自箱线图的四分位数和whikser值。缺点是由于violinplot使用了KDE,我们需要调整一些额外参数,与箱形图相比增加了一些复杂性:

sns.catplot(x="total_bill", y="day", hue="time",
            kind="violin", bw=.15, cut=0,
            data=tips)
<seaborn.axisgrid.FacetGrid at 0x20abbf6bc10>

在这里插入图片描述

hue参数只有两个级别时,也可以“拆分”violins,这样可以更有效地利用空间:

sns.catplot(x="day", y="total_bill", hue="sex",
            kind="violin", split=True, data=tips)
<seaborn.axisgrid.FacetGrid at 0x20abc343c50>

在这里插入图片描述

最后,在violin内的绘图有几种选项,包括显示每个独立的观察而不是摘要箱线图值的方法:

sns.catplot(x="day", y="total_bill", hue="sex",
            kind="violin", inner="stick", split=True,
            palette="pastel", data=tips)
<seaborn.axisgrid.FacetGrid at 0x20abc3423d0>

在这里插入图片描述

我们也可以将swarmplot()striplot()与箱形图或violin plot结合起来,展示每次观察以及分布摘要:

g = sns.catplot(x="day", y="total_bill", kind="violin", inner=None, data=tips)
sns.swarmplot(x="day", y="total_bill", color="k", size=3, data=tips, ax=g.ax)
<Axes: xlabel='day', ylabel='total_bill'>

在这里插入图片描述

类别内的统计估计

对于其他应用程序,你可能希望显示值的集中趋势估计,而不是显示每个类别中的分布。Seaborn有两种主要方式来显示这些信息。重要的是,这些功能的基本 API与上面讨论的API相同。

条形图

实现这一目标的是我们熟悉的条形图。在seaborn中,barplot()函数在完整数据集上运行并应用函数来获取估计值(默认情况下取平均值)。当每个类别中有多个观察值时,它还使用自举来计算估计值周围的置信区间,并使用误差条绘制:

titanic = sns.load_dataset("titanic")
sns.catplot(x="sex", y="survived", hue="class", kind="bar", data=titanic)
<seaborn.axisgrid.FacetGrid at 0x20abd0f9ed0>

在这里插入图片描述

条形图的一个特例是,当你想要显示每个类别中的观察数量而不是计算第二个变量的统计数据时。这类似于分类而非定量变量的直方图。在seaborn中,使用countplot()函数很容易实现:

sns.catplot(x="deck", kind="count", palette="ch:.25", data=titanic)
<seaborn.axisgrid.FacetGrid at 0x20aba0bafd0>

在这里插入图片描述

无论是barplot()还是countplot(),都可以使用上面讨论的所有选项,也可以调用每个函数的文档示例中的其他选项:

sns.catplot(y="deck", hue="class", kind="count",
            palette="pastel", edgecolor=".6",
            data=titanic)
<seaborn.axisgrid.FacetGrid at 0x20abd0e5f90>

在这里插入图片描述

点图

pointplot()函数提供了另一种可视化相同信息的样式。此函数还对另一个轴上的高度估计值进行编码,但不是显示一个完整的条形图,而是绘制点估计值和置信区间。另外,pointplot()连接来自相同hue类别的点。我们可以很容易的看出主要关系如何随着色调语义的变化而变化,因为人类的眼睛很擅长观察斜率的差异:

sns.catplot(x="sex", y="survived", hue="class", kind="point", data=titanic)
<seaborn.axisgrid.FacetGrid at 0x20abcd57fd0>

在这里插入图片描述

当分类函数缺少关系函数中的style语义时, 将markerslinestyles与色调一起改变,以制作最大可访问的图形并在黑白中重现良好,这仍然是一个好主意:

sns.catplot(x="class", y="survived", hue="sex",
            palette={"male": "g", "female": "m"},
            markers=["^", "o"], linestyles=["-", "--"],
            kind="point", data=titanic)
<seaborn.axisgrid.FacetGrid at 0x20abe4c5310>

在这里插入图片描述

绘制“宽格式”数据

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

iris = sns.load_dataset("iris")
sns.catplot(data=iris, orient="h", kind="box")
<seaborn.axisgrid.FacetGrid at 0x20ac1432910>

在这里插入图片描述

另外,axes-level函数接受Pandasnumpy对象的向量,而不是DataFrame中的变量:

sns.violinplot(x=iris.species, y=iris.sepal_length)
<Axes: xlabel='species', ylabel='sepal_length'>

在这里插入图片描述

要控制上面讨论的函数绘制的图形的大小和形状,你必须使用matplotlib命令来进行设置:

f, ax = plt.subplots(figsize=(7, 3))
sns.countplot(y="deck", data=titanic, color="c")
<Axes: xlabel='count', ylabel='deck'>

在这里插入图片描述

显示与 facet 的多种关系

就像relplot()一样, catplot()建立在FacetGrid上,这意味着很容易添加层面变量来可视化高维关系:

sns.catplot(x="day", y="total_bill", hue="smoker",
            col="time", aspect=.6,
            kind="swarm", data=tips)
<seaborn.axisgrid.FacetGrid at 0x20ac1ab8e90>

在这里插入图片描述

要进一步自定义绘图,我们可以使用它返回的FacetGrid对象上的方法:

g = sns.catplot(x="fare", y="survived", row="class",
                kind="box", orient="h", height=1.5, aspect=4,
                data=titanic.query("fare > 0"))
g.set(xscale="log")
<seaborn.axisgrid.FacetGrid at 0x20ac1e0dad0>

在这里插入图片描述

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
鸢尾花数据集是一个经典的分类问题数据集,包含了三个不同品种的鸢尾花的花萼长度、花萼宽度、花瓣长度、花瓣宽度等四个特征,共150个样本。下面我将介绍如何对鸢尾花数据进行可视化分类。 1. 数据可视化 使用Python中的matplotlib和seaborn库对鸢尾花数据进行可视化。代码如下: ```python import seaborn as sns import matplotlib.pyplot as plt import pandas as pd iris = sns.load_dataset('iris') sns.pairplot(iris, hue='species', height=2.5) plt.show() ``` 运行结果如下图所示: ![iris visualization](https://i.imgur.com/UvIYbW1.png) 从图中可以看出,不同品种的鸢尾花在四个特征上有明显差异,可以用这些特征来对鸢尾花进行分类。 2. 数据分类 使用Python中的scikit-learn库对鸢尾花数据进行分类。代码如下: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score iris = load_iris() X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42) knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) y_pred = knn.predict(X_test) print('Accuracy:', accuracy_score(y_test, y_pred)) ``` 运行结果如下所示: ``` Accuracy: 1.0 ``` 使用KNN算法对鸢尾花数据进行分类,得到了100%的分类准确率。说明这四个特征对于鸢尾花分类是非常有效的。 以上就是对鸢尾花数据集进行可视化分类的简单介绍,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值