跳至主要内容

如何制作 Seaborn 直方图:详细指南

了解如何使用 Python 中的 Seaborn 库创建直方图图表。
· 9分钟 阅读

使用 AI 探索

数据可视化是解读复杂数据集的关键环节。

在 Python 编程领域,Seaborn 以其强大的功能脱颖而出,能够创建美观且信息丰富的统计图形,如直方图和折线图。

它构建在 Matplotlib 之上,增强了接口并提供了更多数据可视化选项,尤其适用于统计分析。Seaborn 与 Pandas DataFrame 的无缝集成,使其深受数据科学家和分析师的青睐。

在这份详细指南中,我们将专注于 Seaborn 中最常用的图之一——直方图。

sns.histplot 函数概览

Seaborn 中的 sns.histplot 函数用于绘制直方图,这是检查连续型数据分布的基本工具。该函数功能多样,支持广泛的自定义,便于从数据中提炼有意义的洞见。

该函数是 Seaborn 库众多函数之一。请查看下方速查表以快速了解。

image4.png

数据科学中的 Seaborn 速查表 - 来源

环境准备

导入必要的库

在开始数据可视化之前,我们需要设置环境。这包括导入必要的库,重点是 Seaborn。通常将 Seaborn 以 sns 的别名导入,便于使用。

除了 Seaborn,常用的基础库还包括用于数值计算的 NumPy、用于数据处理的 pandas,以及用于进一步定制的 Matplotlib。

import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

这些都是必备库,提供了在 Python 中创建和操作数据可视化所需的工具。它们是数据分析师和数据科学家最常用的库。

如果您刚开始学习 Python,建议试试我们的《数据科学入门:Python》课程。若想进一步学习 pandas、NumPy 和 Matplotlib,可以参考我们的《使用 pandas 进行数据处理》、《NumPy 入门》和《Matplotlib 数据可视化入门》课程。

准备数据

我们将使用 Scikit-Learn 可加载的波士顿房价数据集。该数据集提供了波士顿不同区域的房屋价值以及若干属性,如犯罪率、平均房间数等。

from sklearn.datasets import load_boston
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df['MEDV'] = boston.target

是否具备适合的直方图数据至关重要。在这里,我们使用的是连续变量——波士顿自有住房的房价中位数(MEDV)。

由于直方图通常展示单个变量的分布,我们将从 DataFrame 中选择一列。

初识 Scikit-Learn?可以尝试我们的《Python 机器学习》教程。如需更多信息,我们的《使用 scikit-learn 的监督学习》课程将帮助您打好基础。

构建您的第一个 Seaborn 直方图

在开始之前,请先确认以下基本前提:

  1. 至少一列连续型数据
  2. 对数据集的基本了解
  3. 熟悉 Pandas DataFrame 的操作
  4. 掌握 Seaborn 的基本语法与函数

我们将先了解 sns.histplot 函数的一些常用语法和参数。

语法与参数

使用 sns.histplot 创建直方图的基本语法非常直观。

关键参数包括:

  • data:数据集,通常为 Pandas DataFrame。
  • x:要绘制直方图的变量。
  • color:设置柱形的颜色。
  • alpha:设置柱形的透明度。
  • bins:使用的箱(柱组)数量。
  • binwidth:每个箱的宽度。
  • kde:布尔值,是否添加核密度估计曲线。
  • hue:基于另一个变量区分数据子集。

该函数可接受许多参数和参数值,但我们将聚焦于适用于本数据集的部分。

创建一个简单直方图

我们先创建一个基础直方图来可视化房价中位数(MEDV)的分布。

plt.figure(figsize=(10, 6))
sns.histplot(data=df, x='MEDV')
plt.title('Distribution of Median Housing Prices in Boston')
plt.xlabel('Median Value of Owner-Occupied Homes (in $1000)')
plt.ylabel('Frequency')
plt.grid(True)
plt.show()

此命令将显示 MEDV 列的直方图。

以下是上述代码生成的图表:

image7.png

这是展示波士顿数据集中房价中位数(MEDV)分布的直方图。它直观呈现了自有住房中位数的频数分布。

增强您的 Seaborn 直方图

调整箱的大小与数量

调整箱的数量有助于更好地理解分布。箱数越多,细节越丰富;箱数较少则可使可视化更简洁。

要增加箱的数量,可以修改 bins 参数。

示例如下:

plt.figure(figsize=(10, 6))
sns.histplot(data=df, x='MEDV', bins=30)
plt.title('Distribution of Median Housing Prices in Boston')
plt.xlabel('Median Value of Owner-Occupied Homes (in $1000)')
plt.ylabel('Frequency')
plt.grid(True)
plt.show()

image2.png

正如上面的 Seaborn 直方图所示,柱形数量已增加到我们设置的 30 个。这样可以更细致地钻取数据,实现更高的粒度。

美化图表

通过自定义诸如柱形颜色与透明度等美观属性,可以让直方图更具信息性且更美观。

在下面的示例中,我用紫色替代了默认颜色,重绘了最初的直方图。

image1.png

以下是我用于生成上图的代码。

plt.figure(figsize=(10, 6))
sns.histplot(data=df, x='MEDV', color='purple')
plt.title('Distribution of Median Housing Prices in Boston')
plt.xlabel('Median Value of Owner-Occupied Homes (in $1000)')
plt.ylabel('Frequency')
plt.grid(True)
plt.show()

添加核密度估计(KDE)

KDE 可提供对数据分布的平滑估计,尤其有助于识别数据中的模式。

它会生成一条平滑曲线,帮助您把握整体趋势。

要实现这一点,我们在函数中使用 kde 参数:

plt.figure(figsize=(10, 6))
sns.histplot(data=df, x='MEDV', kde=True)
plt.title('Distribution of Median Housing Prices in Boston')
plt.xlabel('Median Value of Owner-Occupied Homes (in $1000)')
plt.ylabel('Frequency')
plt.grid(True)
plt.show()

如下所示,这将为直方图叠加一条优雅的曲线。

添加核密度估计(KDE)曲线可对分布给出更平滑的估计。

高级直方图技巧

多变量直方图

通过 hue 参数,可以在同一个直方图中对不同类别进行比较。

该参数允许我们在同一张直方图中区分不同类别,从而直观比较各自的分布。

简而言之,它从 DataFrame 中取一个分类型列,并用不同颜色区分数据。

例如,若我们的 DataFrame 中有名为“CHAS”的列,指示房屋是否临近查尔斯河(1 表示是,0 表示否),我们就可以使用“hue”参数来比较临河与非临河房屋的房价中位数分布。

image3.png

代码如下:

plt.figure(figsize=(10, 6))
sns.histplot(data=df, x='MEDV', hue='CHAS')
plt.title('Distribution of Median Housing Prices in Boston')
plt.xlabel('Median Value of Owner-Occupied Homes (in $1000)')
plt.ylabel('Frequency')
plt.grid(True)
plt.show()

这将生成一个直方图,其中沿查尔斯河(CHAS=1)与不沿河(CHAS=0)的住房 MEDV 分布以不同颜色区分。

Seaborn 直方图最佳实践

在构建 Seaborn 直方图时,有几项需要注意的要点如下:

1. 选择合适的箱数

选择合适的箱数是创建信息量充足直方图的关键。箱数越多,细节越丰富,但也可能导致过拟合并误导对数据的理解。

相反,箱数过少又可能过度简化分布。

一种经验方法是使用 Scott 法则(Scott's Rule)来选择合适的箱宽。该法则根据数据点数量计算理想的箱宽。

2. 在细节与清晰度之间取得平衡

在直方图中提供足够细节固然重要,但同样需要确保可视化清晰且易于解读。

加入过多元素,例如 KDE 曲线或过多颜色,可能会导致视觉杂乱、难以理解。

最好在信息量与简洁性之间找到平衡。

3. 考虑数据类型

所可视化的数据类型也会影响直方图参数的选择。

例如,连续变量与分类变量相比,需要不同的箱宽设置。

创建直方图时务必考虑数据的性质,以确保准确呈现其分布。

当然,Seaborn 只是 Python 数据可视化库之一。若您更偏好,也可以选择在 Matplotlib 中创建直方图。

结语

Seaborn 是一个强大的 Python 可视化库,histplot 函数可轻松创建直方图。只需调整函数中的参数,您就能改变图表的呈现效果,以实现所需的细节与美观度。

请记住上述 Seaborn 直方图技巧:始终考虑数据类型、选择合适的箱宽,并在细节与清晰度之间取得平衡。

想进一步了解 Seaborn 及其强大的数据可视化能力?我们的《Seaborn 数据可视化入门》课程非常适合初学者。

Austin Chia

作者

Austin Chia

我是 Austin,一名博主和科技作者,曾在医疗领域担任数据科学家与数据分析师,拥有多年的从业经验。我以生物学背景开启技术之路,如今通过我的科技博客帮助他人完成同样的转型。我对技术的热情促使我为数十家 SaaS 公司撰写内容,分享经验、启发他人。

主题