Python Seaborn分布图绘制:10个实战示例详解

顾言
顾言
发布时间:2026-10-15| 6人浏览过
原创

本文通过10个具体示例,详细讲解如何使用Python的Seaborn库绘制分布图。内容涵盖直方图、核密度估计(KDE)图和经验累积分布函数(Ecdf)图的创建与参数调整,包括处理异常值、分类变量分组及二维分布等场景,帮助读者掌握数据探索中的关键可视化技巧。

前言

本文将通过10个具体示例,详细介绍如何利用Python中的Seaborn库来创建各类图表。

对于任何数据产品而言,首要任务都是深入理解原始数据。这一环节对于产品的成功与高效至关重要,往往占据了整个工作流程的很大比重。

理解和探索数据的方法多种多样,其中一种有效手段是进行数据可视化。通过可视化,我们能够更直观地探索和解读数据背后的信息。

设计精良且恰当的可视化图表,有助于我们揭示数据中隐藏的结构与内在关系。

在数据分析领域,分布图扮演着极其重要的角色。它们不仅能帮助我们识别异常值和数据的偏态特征,还能提供关于集中趋势(如平均值、中位数和众数)的概览。

为了演示,我们将使用Kaggle平台上提供的墨尔本住房数据集中的一小部分样本。

首先,我们需要导入必要的库,并将数据集读取到Pandas数据框中。

import pandas as pd 
import seaborn as sns 
sns.set(style="darkgrid", font_scale=1.2) 
df = pd.read_csv( 
  "/content/melb_housing.csv",  
  usecols=["Regionname", "Type", "Rooms", "Distance", "Price"] 
) 
df.head()

该数据集记录了墨尔本房屋的一些关键特征及其对应的价格信息。

Seaborn提供的离散绘图函数支持生成3种不同类型的分布图,具体包括:

  • 柱状图(直方图)
  • KDE(核密度估计)图
  • Ecdf(经验累积分布函数)图

我们只需调整kind参数即可指定所需的绘图类型。

示例 1

第一个示例演示如何创建一个基本的直方图。该图表将连续变量的取值范围划分为离散的区间(箱子),并展示每个区间内的数值数量。

sns.displot( 
  data=df, 
  x="Price", 
  kind="hist", 
  aspect=1.4 
)

我们将数据框的名称传递给data参数,x参数用于指定要绘制的列名,aspect参数则用于调整图表的宽高比,同时也可通过height参数改变高度。

示例 2

从第一个示例的图表中可以清晰地看到,价格列中存在一些异常值。柱状图右侧呈现出长尾形态,这表明价格极高的房屋数量较少。

为了降低这种异常值对图表的影响,我们可以对数值取对数。displot函数提供了log_scale参数来实现这一操作。

sns.displot( 
  data=df, 
  x="Price", 
  kind="hist", 
  aspect=1.4, 
  log_scale=10 
)

此时,价格以10的幂次方表示,从而让我们对房价分布有了更清晰的概览。

示例 3

我们还可以调整直方图中的箱子数量。在某些情况下,使用较少的箱子数量能提供更结构化的概览。

用于此调整的参数是bins。

sns.displot( 
  data=df, 
  x="Price", 
  kind="hist", 
  aspect=1.4, 
  log_scale=10, 
  bins=20 
)

示例 4

数据集中还包含分类变量。例如,Type列包含3个类别:h(独立房屋)、t(联排房屋)和u(公寓)。我们可能需要分别检查各类别的分布情况。

一种可行的方案是在同一张图表中用不同颜色展示各类别。只需将列名传递给hue参数即可实现。

sns.displot( 
  data=df, 
  x="Price", 
  hue="Type", 
  kind="hist", 
  aspect=1.4, 
  log_scale=10, 
  bins=20 
)

该图表提供了两条关键信息:

  • 各类别的大小与房屋数量相关。其中,h类是最大的类别。
  • 各类房屋的价格分布情况。

示例 5

另一种检查各类别分布的方法是创建独立的子图。我们可以利用col或row参数来完成此任务,给定列中的每个类别都会生成一个子图。

sns.displot( 
  data=df, 
  x="Price", 
  col="Type", 
  kind="hist", 
  aspect=1.4, 
  log_scale=10, 
  bins=20 
)

例子 6

displot函数还支持生成二维直方图,从而提供关于两列中观测值(即行)分布的概览。

我们使用Price和Distance列创建了一个二维直方图,只需将列名分别传递给x和y参数即可。

sns.displot( 
  data=df, 
  x="Price", 
  y="Distance", 
  col="Type", 
  kind="hist", 
  height=5, 
  aspect=1.2, 
  log_scale=(10,0), 
  bins=20 
)

颜色较深的区域密度更大,包含更多的观测数据。由于密集区域位于中心,这两列数据看起来都呈正态分布。

您可能已经注意到,我们将一个元组作为log_scale参数的值。因此,我们可以为每一列传递不同的比例尺。

例子 7

KDE图同样可用于可视化变量的分布。它们与直方图相似,但KDE图使用连续的概率密度曲线来表示分布,而非离散的箱子。

将kind参数设置为“kde”即可生成KDE图。

sns.displot( 
  data=df, 
  x="Price", 
  kind="kde", 
  aspect=1.4, 
  log_scale=10 
)

示例 8

与直方图类似,我们可以为不同的类别分别绘制KDE图。我们的数据集包含房屋的区域信息,接下来我们将观察不同地区的价格变化。

sns.displot( 
  data=df, 
  x="Price", 
  hue="Regionname", 
  kind="kde", 
  height=6, 
  aspect=1.4, 
  log_scale=10 
)

数据显示,南部大都市区的平均房价似乎最高。

示例 9

检查变量分布的另一种方法是使用Ecdf图。它展示了低于给定列中每个唯一值的观测值的比例或计数。

这是一种累积分布的可视化方式,因此我们能够观察到更密集的值范围。

sns.displot( 
  data=df, 
  x="Distance", 
  kind="ecdf", 
  height=6, 
  aspect=1.4, 
  stat="count" 
)

曲线斜率较高的值范围包含更多的观测值。例如,距离超过30的房屋数量并不多;相反,在距离10到15的范围内有大量的房屋。

示例10

Ecdf图同样支持hue、col和row参数。因此,我们可以在单列图表中区分不同类别之间的分布差异。

sns.displot( 
  data=df, 
  x="Distance", 
  kind="ecdf", 
  hue="Type", 
  height=6, 
  aspect=1.4, 
  stat="count" 
)

对于数据分析或机器学习任务,了解变量(即特征)的分布至关重要,我们处理特定任务的方式往往取决于数据的分布形态。

在本文中,我们展示了如何利用Seaborn的displot函数来分析Price和Distance列的分布情况。

以上就是Python+Seaborn绘制分布图的示例详解的详细内容,更多关于Python Seaborn分布图的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。