Fork me on GitHub

Seaborn教程之绘图函数(二)

一、绘图函数

绘图函数主要分成三类:

  • 可视化统计关系
  • 可视化数据分布
  • 可视化分类数据

它们的关系如下:

例如,displot()是 distributions 模块的图级函数。histplot()它的默认行为是绘制直方图:

penguins = sns.load_dataset("penguins")
print(penguins.head())

species island bill_length_mm ... flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 ... 181.0 3750.0 Male
1 Adelie Torgersen 39.5 ... 186.0 3800.0 Female
2 Adelie Torgersen 40.3 ... 195.0 3250.0 Female
3 Adelie Torgersen NaN ... NaN NaN NaN
4 Adelie Torgersen 36.7 ... 193.0 3450.0 Female

[5 rows x 7 columns]

sns.histplot(data=penguins, x="flipper_length_mm", hue="species", multiple="stack")

通过displot()也是可以达到这种效果的:

sns.displot(data=penguins, x="flipper_length_mm", hue="species", multiple="stack", kind="kde")

说明:只需要在displot()函数中添加kind参数即可。

二、可视化统计关系

统计分析是理解数据集中的变量如何相互关联以及这些关系如何依赖于其他变量的过程。可视化可以成为这个过程的核心组成部分,因为当数据被正确可视化时,人类视觉系统可以看到表明关系的趋势和模式。

我们最常使用的是relplot(). 这是一个图形级函数,用于使用两种常用方法可视化统计关系:散点图和线图:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="darkgrid")

(一)散点图-scatterplot

散点图绘制有两种方式:

# 1、relplot()函数
tips = sns.load_dataset("tips")
sns.relplot(data=tips, x="total_bill", y="tip")
# 2、scatterplot函数
tips = sns.load_dataset("tips")
sns.scatterplot(data=tips, x="total_bill", y="tip")

(二)折线图-lineplot

折线图绘制有两种方式:

# 1、relplot()函数
tips = sns.load_dataset("tips")
sns.relplot(data=tips, x="total_bill", y="tip", kind="line")
# 2、lineplot函数
tips = sns.load_dataset("tips")
sns.lineplot(data=tips, x="total_bill", y="tip")

三、可视化数据分布

任何分析数据或建模数据的早期步骤都应该是了解变量的分布方式。分布可视化技术可以快速回答许多重要问题。观察的范围是什么?他们的中心趋势是什么?它们是否严重偏向一个方向?有双峰性的证据吗?是否有明显的异常值?这些问题的答案是否因其他变量定义的子集而异?

分布模块包含几个旨在回答此类问题的函数。轴级函数是histplot()kdeplot()ecdfplot()rugplot()

(一)直方图-histplot

直方图绘制有两种方式:

# 1、displot()函数
penguins = sns.load_dataset("penguins")
sns.displot(penguins, x="flipper_length_mm")
# 2、histplot函数
penguins = sns.load_dataset("penguins")
sns.histplot(penguins, x="flipper_length_mm")

(二)核密度估计-kdeplot

直方图旨在通过合并和计数观察来近似生成数据的潜在概率密度函数。核密度估计 (KDE) 为同一问题提供了不同的解决方案。KDE 图不是使用离散箱,而是使用高斯核对观察结果进行平滑处理,从而产生连续的密度估计:

sns.displot(penguins, x="flipper_length_mm", kind="kde")

与直方图一样,如果您分配一个hue变量,将为该变量的每个水平计算单独的密度估计:

sns.displot(penguins, x="flipper_length_mm", hue="species", kind="kde")

在许多情况下,分层 KDE 比分层直方图更容易解释,因此它通常是比较任务的不错选择。许多用于解决多个发行版的相同选项也适用于 KDE:

sns.displot(penguins, x="flipper_length_mm", hue="species", kind="kde", multiple="stack")

(三)经验累积分布-ecdfplot

“经验累积分布函数”(ECDF)绘制了一条通过每个数据点的单调递增曲线,使得曲线的高度反映了具有较小值的观测值的比例:

sns.displot(penguins, x="flipper_length_mm", kind="ecdf")

ECDF 图有两个主要优点。与直方图或 KDE 不同,它直接表示每个数据点。这意味着无需考虑 bin 大小或平滑参数。此外,由于曲线是单调递增的,因此非常适合比较多个分布:

sns.displot(penguins, x="flipper_length_mm", hue="species", kind="ecdf")

ECDF 图的主要缺点是它表示分布形状不如直方图或密度曲线直观。

(四)边际分布

通过沿 x 轴和 y 轴绘制刻度来绘制边际分布,此功能旨在通过以不显眼的方式显示单个观察的位置来补充其他图。

sns.rugplot(data=penguins, x="bill_length_mm", y="bill_depth_mm")

补充其它分布:

sns.relplot(data=penguins, x="bill_length_mm", y="bill_depth_mm")
sns.rugplot(data=penguins, x="bill_length_mm", y="bill_depth_mm")

四、可视化分类数据-catplot

在上面内容中讨论了如何使用不同的视觉表示来显示数据集中多个变量之间的关系,下面讨论以下分类数据可视化,将其分为三类:

分类散点图:

分类分布图:

分类估计图:

(一)分类散点图

1、抖动图-stripplot

属于一个类别的所有点都将落在与分类变量相对应的轴上的相同位置。这是catplot函数默认的类型。

tips = sns.load_dataset("tips")
sns.catplot(data=tips, x="day", y="total_bill")

jitter参数控制抖动的幅度或完全禁用它:

sns.catplot(data=tips, x="day", y="total_bill", jitter=False)

2、非重叠图-swarmplot

使用防止重叠的算法调整分类轴上的点。它可以更好地表示观察的分布,尽管它只适用于相对较小的数据集。

sns.catplot(data=tips, x="day", y="total_bill", kind="swarm")

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

sns.catplot(data=tips, x="day", y="total_bill", hue="sex", kind="swarm")

在这些示例中,它始终对应于水平轴。但是将分类变量放在纵轴上通常是有帮助的(特别是当类别名称比较长或者类别很多的时候)。为此,将变量分配交换到轴:

sns.catplot(data=tips, x="total_bill", y="day", hue="time", kind="swarm")

(二)分类分布图

随着数据集大小的增长,分类散点图在它们可以提供的关于每个类别中值分布的信息方面变得有限。当发生这种情况时,有几种方法可以通过便于跨类别级别轻松比较的方式来汇总分布信息。

1、箱线图-boxplot

这种图显示了分布的三个四分位值以及极值。

sns.catplot(data=tips, x="day", y="total_bill", kind="box")

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

sns.catplot(data=tips, x="day", y="total_bill", hue="smoker", kind="box")

2、小提琴图-violinplot

它将箱线图与分布教程中描述的核密度估计程序相结合。

sns.catplot(
    data=tips, x="total_bill", y="day", hue="sex", kind="violin",
)

这种方法使用核密度估计来提供对值分布的更丰富的描述。此外,箱线图显示在小提琴内部。缺点是,因为 violinplot 使用 KDE,还有一些其他参数可能需要调整,相对于简单的箱线图增加了一些复杂性:

sns.catplot(
    data=tips, x="total_bill", y="day", hue="sex",
    kind="violin", bw=.15, cut=0,
)

3、字母值图-boxenplot

为更大的数据集绘制增强的箱线图。

这种绘图样式最初被命名为“字母值”图,因为它显示了大量定义为“字母值”的分位数。它类似于箱形图,绘制分布的非参数表示,其中所有特征都对应于实际观察。通过绘制更多的分位数,它提供了更多关于分布形状的信息,尤其是在尾部

diamonds = sns.load_dataset("diamonds")
sns.catplot(
    data=diamonds.sort_values("color"),
    x="color", y="price", kind="boxen",
)

(三)分类估计图

对于其他应用程序,您可能不想显示每个类别内的分布,而是显示值的集中趋势的估计值。

1、条形图-barplot

在 seaborn 中,该barplot()函数对完整数据集进行操作,并应用一个函数来获得估计值(默认取平均值)。当每个类别中有多个观察值时,它还使用引导程序来计算估计值的置信区间,该区间使用误差条绘制:

titanic = sns.load_dataset("titanic")
sns.catplot(data=titanic, x="sex", y="survived", hue="class", kind="bar")

默认误差条显示 95% 的置信区间,但是(从 v0.12 开始),可以从许多其他表示中进行选择:

sns.catplot(data=titanic, x="age", y="deck", errorbar=("pi", 95), kind="bar")

2、计数图-countplot

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

sns.catplot(data=titanic, x="deck", kind="count", palette="ch:.25")

countplot()可以使用一些参数进行调用:

sns.catplot(
    data=titanic, y="deck", hue="class", kind="count",
    palette="pastel", edgecolor=".6",
)

3、点图-pointplot

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

titanic = sns.load_dataset("titanic")
sns.catplot(data=titanic, x="sex", y="survived", hue="class", kind="point")

虽然分类函数缺乏style关系函数的语义,但改变标记和/或线条样式以及色调仍然是一个好主意,以使图形最容易访问并在黑白中很好地再现:

sns.catplot(
    data=titanic, x="class", y="survived", hue="sex",
    palette={"male": "g", "female": "m"},
    markers=["^", "o"], linestyles=["-", "--"],
    kind="point"
)
posted @ 2023-01-19 10:12  iveBoy  阅读(651)  评论(0)    收藏  举报
TOP