- Matplotlib: Python 最基础、最底层的绘图库,功能强大且高度可定制。
- 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 可视化库都基于它构建。
基本用法
确保你已经安装了 matplotlib 和 numpy(用于生成示例数据)。
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 数据框 结合使用。
基本用法
安装 seaborn 和 pandas。
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'])
-
与
stripplot或swarmplot结合:在箱线图上叠加原始数据点,可以更直观地看到数据分布。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 进行修改和美化。
