跳至主要内容

Python 箱线图:初学者全面指南

在 Python 中创建出色的箱线图!这份全面的新手教程涵盖 Matplotlib 与 Seaborn,助您可视化并比较数据分布。
· 15分钟 阅读

使用 AI 探索

您是否想过,如何在 Python 中更好地呈现数值数据的分布?答案之一就是学会使用箱线图!箱线图非常适合可视化多个分组之间的分布对比。

在本教程中,我们将介绍什么是箱线图、在 Python 中创建它们的不同方式,以及一些常见的新手错误。

什么是 Python 箱线图?

箱线图(box-and-whisker plot)是一种基于五数概括(最小值、第一四分位数 Q1、中位数、第三四分位数 Q3、最大值)的标准数据展示方式。

箱线图尤其有助于识别离群值,并理解数据的离散程度与偏态。它既可用于比较多个分组,也可用于展示单个变量的分布。

箱线图的组成

一个典型的箱线图由以下几个部分构成:

  1. 中位数:数据的中间值,以箱体中的一条线表示。
  2. 箱体:表示数据的四分位距(IQR),即 Q1 和 Q3 之间的范围。箱体的下边缘和上边缘分别代表 Q1 和 Q3。
  3. 须:从箱体两端延伸的垂直线,表示不含离群值的最小值和最大值。
  4. 离群值:位于须之外、相较于其他数据显得异常的点。
  5. 端帽:须末端的水平线,表示最小值和最大值,包括任何离群值。

这些组成部分共同赋予箱线图统计含义,并便于对不同数据组进行直观比较。

Python 是一个强大的工具,可以帮助我们创建箱线图。接下来我们将回顾几种实现方法。

Python 箱线图:分步指南

在了解了箱线图的基础概念后,让我们看看如何使用 Python 创建它们。Python 中有多种库支持绘制箱线图,如 Matplotlib、Seaborn 和 Plotly。

要在 Python 中创建箱线图,首先需要安装必要的库。主要用到的库是 Matplotlib、Seaborn 和 Plotly。

安装命令如下:

pip install matplotlib
pip install seaborn
pip install plotly==5.22.0

安装完成后,下一步是在您的 Python 环境中导入这些库。

同时,确保加载将用于绘制箱线图的必要数据集(如有)。

#imports Matplotlib library and assigns shorthand 'plt'
import matplotlib.pyplot as plt
#imports Seaborn library and assigns shorthand 'sns'
import seaborn as sns
#imports Plotly library and assigns shorthand 'px'
import plotly.express as px

得益于 Python 的灵活性,创建一个简单的箱线图只需极少代码。让我们从最常用的 Matplotlib 库开始。

要使用 Matplotlib 创建箱线图,先导入所需库:

import matplotlib.pyplot as plt
import numpy as np

接着,准备一个简单的数据集:

# Generates some random dataset
np.random.seed(10) 
data = np.random.normal(0, 1, 100)

最后,创建箱线图并显示:

# Creates a boxplot
plt.boxplot(data) plt.title('Basic Boxplot') plt.show()

结果如下:Basic Matplotlib plot

如果您想在不同的子图中分别创建箱线图,可以使用 subplot 函数。这可以在一张图像中并排显示多个箱线图。

完整代码示例如下:

import matplotlib.pyplot as plt
import numpy as np
# Generates multiple datasets
data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)
# Creates subplots
fig, axs = plt.subplots(1, 3, figsize=(15, 5))
# Plots Boxplot for Data 1
axs[0].boxplot(data1)
axs[0].set_title('Data 1')
axs[0].set_xlabel('Sample')
axs[0].set_ylabel('Value')
# Plots Boxplot for Data 2
axs[1].boxplot(data2)
axs[1].set_title('Data 2')
axs[1].set_xlabel('Sample')
axs[1].set_ylabel('Value')
# Plots Boxplot for Data 3
axs[2].boxplot(data3)
axs[2].set_title('Data 3')
axs[2].set_xlabel('Sample')
axs[2].set_ylabel('Value')
# Adjusts layout
plt.tight_layout()
plt.show()

得到的图如下:

Multiple boxplots in Matplotlib

不过,这些子图并不共享同一坐标轴,不适合在类别之间做并排对比。若要在同一坐标轴上绘制多个箱线图,您需要创建分组箱线图。

分组箱线图特别适用于比较多个类别的分布,可帮助更细致地理解数据。这些比较能揭示其他图表不易察觉的差异。

每个组都会在同一图中并排呈现,便于突出不同子类别间的差异、趋势和离群值。

如下所示可以创建分组子图:

# Generates grouped data
data_group1 = [np.random.normal(0, 1, 100), np.random.normal(1, 2, 100), np.random.normal(2, 1.5, 100)]
data_group2 = [np.random.normal(0, 1, 100), np.random.normal(1, 2, 100), np.random.normal(2, 1.5, 100)]
# Combines two data groups into a dataset
data = data_group1 + data_group2
# Creates grouped boxplots
plt.boxplot(data, positions=[1, 2, 3, 5, 6, 7], labels=['G1-D1', 'G1-D2', 'G1-D3', 'G2-D1', 'G2-D2', 'G2-D3'])
plt.title('Grouped Boxplots')
plt.xlabel('Group-Dataset')
plt.ylabel('Value')
plt.show()

上述代码将生成如下分组箱线图:

Grouped boxplots in Matplotlib

您可以在 Matplotlib 中进行高级自定义,以提升数据可视化效果。

例如添加均值和标准差、创建分组箱线图、使用水平箱线图等技巧,都能更好地洞察数据分布。

在 Python 中自定义箱线图,还能让图形更契合项目需求。

以下是使用 Matplotlib 自定义箱线图的一些方法:

1. 添加标签和标题

标题和标签能让您的图表更易于理解,观众可以快速看出数据对比。添加方式很直接,可使用 Matplotlib 的相关函数完成。

为 Matplotlib 箱线图添加标签:

plt.boxplot(data)
# Adds title
plt.title('Customized Boxplot Title')
# Adds x axis label
plt.xlabel('Customized X Label')
# Adds y axis label
plt.ylabel('Customized Y Label')
plt.show()

这将创建一个带有标签的箱线图,如下图所示:

Customized boxplot title and labels in Matplotlib

2. 调整箱线图颜色

在 Python 中自定义箱线图的颜色和样式,可使数据呈现更美观清晰,也有助于向相关方突出特定数据点或对比。

您可以通过 boxprops、whiskerprops、capprops、medianprops 和 flierprops 参数分别更改箱体、须、端帽、中位数和离群点的颜色。

示例代码如下:

plt.boxplot(data, boxprops=dict(color='blue'), whiskerprops=dict(color='red'), capprops=dict(color='green'), medianprops=dict(color='orange'), flierprops=dict(markerfacecolor='red', marker='o'))
plt.show()

这将根据您设置的参数,为箱线图的各组件应用不同颜色:

Boxplot customizing colors in Matplotlib

3. 添加均值与标准差

在箱线图中加入均值和标准差,可提供更多统计信息。

# Creates dataset
data1 = np.random.normal(0, 1, 100)
data2 = np.random.normal(1, 2, 100)
data3 = np.random.normal(2, 1.5, 100)
# Calculates the mean and standard deviations
mean = [np.mean(d) for d in data]
std_devs = [np.std(d) for d in data]
# Creates a boxplot
plt.boxplot(data, labels=['Data 1', 'Data 2', 'Data 3'])
# Adds mean as red dots
for i in range(len(mean)):
   plt.plot(i + 1, mean[i], 'ro')
# Adds standard deviations as error bars
for i in range(len(std_devs)):
   plt.errorbar(i + 1, mean[i], yerr=std_devs[i], fmt='o', color='red')
# Plots graph
plt.title('Boxplot with Means and Standard Deviations')
plt.xlabel('Dataset')
plt.ylabel('Value')
plt.show()

结果如下:

Boxplot with mean and SD in Matplotlib

4. 水平箱线图

在类别名称较长时,水平箱线图往往更易阅读。

在 Matplotlib 中,只需在 boxplot 函数中设置 vert 参数即可实现。

# Creates horizontal boxplot
plt.boxplot(data,
            labels=['Data 1', 'Data 2', 'Data 3'], 
            vert=False)
# Plots graph
plt.title('Horizontal Boxplot')
plt.xlabel('Value')
plt.ylabel('Dataset')
plt.show()

运行上述代码将得到如下图:

Horizontal boxplot in Matplotlib

我们的 Matplotlib 数据可视化入门课程也能帮助您掌握除箱线图之外的更多可视化方法。

如果您希望日后随时查阅,此处提供一份 Matplotlib 绘图速查表:

Matplotlib cheatsheet

Seaborn 基于 Matplotlib 构建,能以极少代码轻松创建美观的箱线图。其语法简洁,适合各个水平的用户,并且可与其他库集成,最大化数据分析的灵活性。

下面分步演示如何用 Seaborn 创建一个基本箱线图。与之前一样,先导入必要的库。

# Imports necessary libraries
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

接着,准备一个简单的数据集:

# Generates a random dataset
np.random.seed(10)
data = np.random.normal(0, 1, 100)

最后,创建箱线图并显示:

# Creates a basic boxplot
sns.boxplot(data=data)
# Adds title to the boxplot
plt.title('Basic Boxplot') 
plt.show()

结果如下:

Basic seaborn boxplot

您可以通过 hue、orient 和 palette 参数自定义 Seaborn 图形。

让我们看看如何根据类别为箱线图添加颜色,使用 hue 参数:

# Generate multiple datasets
data = {
    'Group': ['A']*100 + ['B']*100 + ['C']*100,
    'Value': np.concatenate([np.random.normal(0, 1, 100), 
                             np.random.normal(1, 2, 100), 
                             np.random.normal(2, 1.5, 100)])
}
df = pd.DataFrame(data)
# Create additional grouping data
df['Subgroup'] = np.random.choice(['X', 'Y'], size=300)
# Plots graph
sns.boxplot(x='Group', y='Value', data=df, hue='Subgroup', palette='Set2')
plt.title('Colored Boxplot')
plt.show()

修改后的箱线图如下:

Colored seaborn boxplot

若要让箱线图按特定方向排列,请使用 orient 参数。垂直方向设为 'v',水平方向设为 'h'。

以下为水平箱线图的代码:

# Plots horizontal boxplot
sns.boxplot(data=df, orient='h', palette='Set2')
plt.title('Colored Boxplot')
plt.show()

上述代码将生成如下图:

Horizontal seaborn boxplot

要在箱线图上叠加单个数据点,可以使用 swarmplot 绘制蜂群图:

# Plots boxplot
sns.boxplot(x='Group', y='Value', data=df)
# Overlays swarm plot over boxplot
sns.swarmplot(x='Group', y='Value', data=df, color='black', alpha=0.5)
plt.title('Boxplot with Swarmplot')
plt.show()

上述代码将生成如下图:

Boxplot with swarmplot

这样的蜂群图有助于进一步揭示数据分布情况,与箱线图的统计信息相辅相成,为观众提供更全面的视角。

想了解更多在 Seaborn 中实现数据可视化的方法,请查看我们的Seaborn 数据可视化入门课程。

如果您希望日后随时查阅,此处提供一份 Seaborn 绘图速查表:

Seaborn cheat sheet

解读 Python 箱线图结果

如何解读箱线图,取决于具体情境和所要回答的研究问题。

不过,一些通用原则可以帮助您理解箱线图所展示的数据分布,包括:

  • 中位数线表示数据集的中间值。
  • 四分位距(IQR)或中间 50% 的取值位于第一四分位数(Q1)与第三四分位数(Q3)之间。
  • 须分别向上超出 Q3、向下低于 Q1 1.5 倍 IQR 的范围。
  • 离群值通常以点或星号单独绘出。
  • 箱体与须的长度反映数据的离散程度。
  • 偏态分布会在箱体相对于中位数线的大小与位置上表现出不对称。
  • 超出 Q3 以上或 Q1 以下 1.5 倍 IQR 的离群值,可能表示极端取值或数据测量中的潜在错误。

创建 Python 箱线图时常见的错误

尽管 Python 能让您基于数据集轻松创建美观的箱线图,但仍需注意一些方面,以避免产生误导或不正确的可视化。

1. 未处理缺失值

在创建箱线图时,实践者常忽视数据预处理的重要性,从而导致误导性结果。

所有数据可视化在绘图前都需要一定的清洗。箱线图也不例外,缺失值可能被显示为离群值,从而影响结果。

2. 数据缩放不当

此外,用户有时未对数据进行合适的缩放,导致箱线图出现偏差,无法真实反映数据集的特征。缩放处理可确保各特征在分析中贡献均衡。

3. 未处理离群值

最后,分析人员可能忽视在绘图前充分检查并处理离群值。对离群值处理不当会影响解读,因此要区分真正的离群值与数据采集中出现的错误或异常。

在构建数据可视化时,不妨参考这份速查表:

Data visualization cheat sheet

总结

箱线图是可视化数据分布并在不同类别之间进行比较的有力工具。

在 Python 中,您可以使用 Matplotlib、Seaborn 或 Plotly 快速创建箱线图,且无需过多编码。DataCamp 为这些工具都提供了系统课程:

想进一步探索如何用 Python 进行数据可视化?可以查看 Python 数据可视化技能路径!

FAQs

箱线图可以用于非数值型数据吗?

不能。箱线图是专为数值型数据设计的。它基于五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值)来表示数据分布,这需要数值型取值。对于非数值数据,更合适的可视化方式包括条形图或饼图。

如何解读箱线图中出现多个离群值?

箱线图中出现多个离群值,表示有多处数据点与整体数据显著不同。这可能意味着数据存在较大的变异或不寻常的观测,需要进一步调查。离群值可能源于数据采集错误、自然波动,或数据内部子群体存在显著差异。

我可以用箱线图比较多个类别之间的数据分布吗?

可以。箱线图非常适合比较不同类别之间的分布。您可以将不同类别的箱线图并排放置,以比较它们的中位数、四分位距以及离群值情况,从而识别各组分布的异同。

解读箱线图时要避免哪些常见陷阱?

解读箱线图时,请避免以下误区:

  • 忽视离群值的语境:离群值不一定是错误,可能具有实际意义。
  • 将中位数误解为均值:中位数是中间值而非平均值,且受离群值影响较小。
  • 忽略样本量的重要性:样本量过小会导致箱线图具有误导性。请确保数据量足以支持可靠的解读。
如何在 Python 中创建交互式箱线图?

要在 Python 中创建交互式箱线图,您可以使用 Plotly 或 Bokeh 等库。它们支持为可视化添加交互功能,例如工具提示、缩放和平移。

Austin Chia

作者

Austin Chia

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

主题