杰瑞科技汇

Python boxplot如何绘制?参数怎么用?

  1. Matplotlib: Python 最基础、最底层的绘图库,功能强大且高度可定制。
  2. Seaborn: 基于 Matplotlib 的高级可视化库,语法更简洁,图表更美观,尤其适合统计图表。

箱线图的核心概念

在讲解代码之前,我们先快速理解箱线图的各个部分,这样能更好地解读图表。

  • 箱体: 这是箱线图的核心。
    • 下边线: 第一四分位数 (Q1),表示 25% 的数据点小于或等于这个值。
    • 上边线: 第三四分位数 (Q3),表示 75% 的数据点小于或等于这个值。
    • 箱体中间的线: 中位数 (Q2),表示 50% 的数据点小于或等于这个值。
    • 箱体的长度: IQR (Interquartile Range, 四分位距),即 IQR = Q3 - Q1,它代表了数据中间 50% 的离散程度。
  • :
    • 从箱体上下边缘延伸出来的线,通常表示数据的“正常”范围。
    • 上须: 通常定义为 Q3 + 1.5 * IQR
    • 下须: 通常定义为 Q1 - 1.5 * IQR
    • 所有位于须之内的数据点都被认为是正常的。
  • 异常值: 位于须之外的数据点,它们通常被绘制为独立的点(圆圈或星号),表示这些数据可能与数据集的主体分布有显著差异。

使用 Matplotlib 绘制箱线图

Matplotlib 是最基础的绘图库,几乎所有 Python 可视化库都基于它构建。

基本用法

确保你已经安装了 matplotlibnumpy(用于生成示例数据)。

pip install matplotlib numpy

下面是一个最简单的箱线图示例:

import matplotlib.pyplot as plt
import numpy as np
# 1. 准备数据
# 生成一组正态分布的随机数据
data = np.random.normal(loc=100, scale=20, size=200)
# 2. 创建图形和坐标轴
fig, ax = plt.subplots()
# 3. 绘制箱线图
ax.boxplot(data)
# 4. 添加标题和标签
ax.set_title('基本箱线图示例')
ax.set_ylabel('数值')
# 5. 显示图形
plt.show()

代码解释:

  • plt.subplots(): 创建一个图形窗口和一个坐标轴对象 ax,这是一种更现代的 Matplotlib 用法。
  • ax.boxplot(data): 这是核心函数,它接收一个数据序列(如列表或 NumPy 数组)并绘制箱线图。
  • ax.set_title(), ax.set_ylabel(): 设置图表的标题和 y 轴标签。

绘制多组箱线图

比较不同组别的数据分布是箱线图的常见用途。

import matplotlib.pyplot as plt
import numpy as np
# 1. 准备多组数据
group1 = np.random.normal(100, 10, 200)
group2 = np.random.normal(110, 15, 200)
group3 = np.random.normal(90, 20, 200)
# 将数据组合成一个列表
data_to_plot = [group1, group2, group3]
# 2. 创建图形和坐标轴
fig, ax = plt.subplots()
# 3. 绘制多组箱线图
# labels 参数用于为每组数据添加标签
ax.boxplot(data_to_plot, labels=['组别 A', '组别 B', '组别 C'])
# 4. 添加标题和标签
ax.set_title('多组箱线图比较')
ax.set_ylabel('测量值')
ax.set_xlabel('实验组')
# 5. 显示图形
plt.show()

Matplotlib 箱线图常用参数

ax.boxplot() 函数有很多参数可以自定义图表外观:

  • labels: 为每个箱线图组添加标签。
  • showfliers: 是否显示异常值,默认为 True,设为 False 可以隐藏它们。
    ax.boxplot(data, showfliers=False)
  • notch: 是否绘制带凹口的箱线图,凹口可以用来比较中位数,如果两个箱体的凹口不重叠,则可能表明它们的中位数有显著差异。
    ax.boxplot(data, notch=True)
  • patch_artist: 如果为 True,箱体将变成 Artist 对象,可以设置 facecolor(填充色)和 edgecolor(边框色)。
    bp = ax.boxplot(data, patch_artist=True)
    for box in bp['boxes']:
        box.set(facecolor='lightblue', edgecolor='darkblue')
  • vert: 是否垂直绘制箱线图,默认为 True(垂直),设为 False 则水平绘制。
    ax.boxplot(data, vert=False)

使用 Seaborn 绘制箱线图

Seaborn 是一个更高级的库,它让绘制统计图表变得异常简单和美观,它通常与 Pandas 数据框 结合使用。

基本用法

安装 seabornpandas

pip install seaborn pandas
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 1. 准备数据
# Seaborn 常与 Pandas 数据框一起使用
data = pd.DataFrame({
    'value': np.random.normal(100, 20, 200),
    'category': 'A' # 给数据一个类别标签
})
# 2. 创建图形
plt.figure(figsize=(6, 8)) # 可以提前设置图形大小
# 3. 绘制箱线图
# x 是分类变量,y 是数值变量
sns.boxplot(x='category', y='value', data=data)
# 4. 添加标题'Seaborn 基本箱线图')
# 5. 显示图形
plt.show()

代码解释:

  • sns.set_theme(): 设置 Seaborn 的主题风格,让图表更美观。
  • plt.figure(figsize=(...)): 创建一个新的图形窗口,并设置其大小。
  • sns.boxplot(x, y, data): 这是 Seaborn 的核心函数。
    • x: 指定数据框中用于分组的列名(分类变量)。
    • y: 指定数据框中用于绘制箱线图的数值列(数值变量)。
    • data: 传入整个数据框。

绘制多组箱线图

Seaborn 在处理多组数据时非常方便,特别是当数据已经整理在 Pandas 数据框中时。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 1. 准备数据
# 创建一个更复杂的数据集
group_a = np.random.normal(100, 10, 200)
group_b = np.random.normal(110, 15, 200)
group_c = np.random.normal(90, 20, 200)
# 将数据整合成一个长格式的 Pandas 数据框
# 这正是 Seaborn 喜欢的数据格式
df = pd.DataFrame({
    'value': np.concatenate([group_a, group_b, group_c]),
    'experiment_group': ['A'] * 200 + ['B'] * 200 + ['C'] * 200
})
# 2. 创建图形
plt.figure(figsize=(8, 6))
# 3. 绘制多组箱线图
# Seaborn 会自动根据 'experiment_group' 列的唯一值来创建多个箱体
sns.boxplot(x='experiment_group', y='value', data=df)
# 4. 添加标题和标签'Seaborn 多组箱线图比较')
plt.xlabel('实验组')
plt.ylabel('测量值')
# 5. 显示图形
plt.show()

Seaborn 箱线图常用参数和高级用法

Seaborn 的箱线图功能非常丰富,可以轻松地与其他图表结合。

  • hue 参数:根据第三个维度进行颜色区分。

    # 假设我们的数据还有一个 'treatment' 列('X' 或 'Y')
    df['treatment'] = np.random.choice(['X', 'Y'], size=600)
    plt.figure(figsize=(10, 7))
    sns.boxplot(x='experiment_group', y='value', hue='treatment', data=df)
    plt.title('使用 hue 参数进行分组')
    plt.show()

    这会为每个 experiment_group 再根据 treatment 绘制两个并排的箱线图,并用不同颜色区分。

  • showfliers 参数:与 Matplotlib 类似,用于控制是否显示异常值。

    sns.boxplot(x='experiment_group', y='value', data=df, showfliers=False)
  • order 参数:控制箱体的显示顺序。

    sns.boxplot(x='experiment_group', y='value', data=df, order=['C', 'A', 'B'])
  • stripplotswarmplot 结合:在箱线图上叠加原始数据点,可以更直观地看到数据分布。

    plt.figure(figsize=(10, 7))
    # 先绘制箱线图
    sns.boxplot(x='experiment_group', y='value', data=df, color='skyblue', showfliers=False)
    # 再在箱线图上叠加散点图
    sns.stripplot(x='experiment_group', y='value', data=df, color='red', jitter=0.2, size=5)
    plt.title('箱线图 + 散点图')
    plt.show()
    • stripplot: 原始数据点会随机抖动,避免重叠。
    • swarmplot: 原始数据点会智能地避免重叠,但计算量稍大。

Matplotlib vs. Seaborn:如何选择?

特性 Matplotlib Seaborn
易用性 较低,需要手动设置更多细节。 非常高,API 设计直观,适合统计图表。
美观度 默认样式较基础,但可定制性极强。 默认非常美观,自带多种主题和调色板。
数据格式 接受 NumPy 数组、列表等。 与 Pandas 数据框无缝集成,长格式数据是首选。
功能 万能的绘图库,几乎所有图表都能画。 专注于统计可视化,能轻松实现复杂组合(如 hue)。
灵活性 极高,可以像素级地控制图表的每一个元素。 灵活性相对较低,但足以满足绝大多数统计需求。

总结建议

  • 快速、美观地绘制统计图表(如箱线图、小提琴图、热力图等):首选 Seaborn,如果你的数据是 Pandas 数据框,使用 Seaborn 会非常顺畅。
  • 需要高度自定义图表,或者绘制 Seaborn 不支持的复杂、非标准图表:使用 Matplotlib,可以将 Matplotlib 作为底层工具,用 Seaborn 进行初步美化,再用 Matplotlib 进行精细调整。

在实际工作中,两者常常结合使用:用 Seaborn 快速出图,然后用 Matplotlib 的 API 进行修改和美化。

分享:
扫描分享到社交APP
上一篇
下一篇