当前位置:首页 > 技术 > 正文内容

Python数据可视化:深入理解并绘制箱线图

访客 技术 2026年7月2日 1

箱线图的基本概念

箱线图(Box Plot),又称盒须图,是一种用于展示连续型数据分布特征的统计图表。它通过五个关键数值概括数据的整体分布情况:最小值、第一四分位数(Q1)、中位数(Q2)、第三四分位数(Q3)和最大值,并能有效识别异常值。

在标准箱线图中:

  • 下四分位数 Q1:表示数据集中25%的数据小于该值;
  • 上四分位数 Q3:表示75%的数据小于该值;
  • 四分位距 IQR:定义为 IQR = Q3 - Q1,反映中间50%数据的离散程度;
  • 上下边界:通常设定为 Q1 - 1.5×IQR 和 Q3 + 1.5×IQR,超出此范围的点被视为潜在异常值;
  • 中位数:即第二四分位数,位于箱体内的横线,代表数据的中心趋势。
箱线图结构示意图

使用 Matplotlib 绘制箱形图

Matplotlib 提供了 plt.boxplot() 方法来创建箱线图,支持高度自定义外观与样式。

核心参数说明

参数名 作用描述
x 输入数据,可为列表或数组形式
vert 是否垂直显示,默认 True
patch_artist 是否填充箱体颜色
widths 设置箱体宽度
notch 启用缺口显示,突出中位数置信区间
showfliers 控制是否显示异常值
flierprops 配置异常点样式(形状、大小、颜色等)
medianprops 设置中位线的线条属性
whis 调整触须长度倍数,默认为1.5倍IQR

返回值结构

调用 boxplot() 后返回一个字典对象,包含以下绘图组件:

  • boxes:箱体轮廓
  • medians:中位线
  • whiskers:上下触须
  • caps:触须末端帽线
  • fliers:异常值标记
  • means:均值标记(当 showmeans=True 时存在)

代码示例

import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体兼容性
plt.rcParams['font.sans-serif'] = ['SimSun', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

# 生成三组不同方差的正态分布数据
data_sets = [np.random.normal(loc=0, scale=sigma, size=100) for sigma in [1, 2, 3]]
labels = ['X₁', 'X₂', 'X₃']

fig, axes = plt.subplots(1, 2, figsize=(10, 5))

# 左图:普通矩形箱线图
box1 = axes[0].boxplot(
    data_sets,
    vert=True,
    widths=0.35,
    labels=labels,
    patch_artist=True,
    medianprops={'color': 'red', 'linewidth': 2},
    flierprops={'marker': 'v', 'markersize': 6, 'markerfacecolor': '#FF6B35'},
    whiskerprops={'linestyle': '--', 'color': 'purple'}
)
axes[0].set_title("常规箱线图")
axes[0].grid(axis='y', linestyle='--', alpha=0.7)

# 右图:带缺口箱线图
box2 = axes[1].boxplot(
    data_sets,
    notch=True,
    widths=0.35,
    labels=labels,
    patch_artist=True,
    medianprops={'color': 'darkgreen', 'linewidth': 2},
    flierprops={'marker': '>', 'markersize': 6, 'markerfacecolor': 'gold'}
)
axes[1].set_title("带缺口箱线图")
axes[1].grid(axis='y', linestyle='--', alpha=0.7)

# 填充箱体颜色
colors = ['#D6EAF8', '#FADBD8', '#D5F5E3']
for box, color in zip([box1, box2], colors):
    for patch in box['boxes']:
        patch.set_facecolor(color)

plt.tight_layout()
plt.show()
Matplotlib箱线图输出结果

基于 Seaborn 的高级箱线图绘制

Seaborn 是构建于 Matplotlib 之上的高级可视化库,特别适合处理 Pandas DataFrame 数据结构,提供更简洁美观的统计图形接口。

主要参数解析

参数 功能说明
data 输入数据集,推荐使用 DataFrame
x, y 指定坐标轴变量名称
hue 按某一分类变量进行分组对比
orient 设定方向,'v' 垂直,'h' 水平
palette 配色方案,如 "Set2", "husl" 等
saturation 颜色饱和度调节(0~1)
dodge 多组比较时是否错开位置
whis IQR倍数,决定触须长度
**kwargs 传递底层 matplotlib 参数,如 medianprops

实战绘图案例

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

# 加载内置泰坦尼克号数据集
titanic_df = sns.load_dataset("titanic").dropna(subset=['age', 'fare'])

fig, axes = plt.subplots(2, 3, figsize=(15, 10))

# 图1:按舱位等级划分的年龄分布
sns.boxplot(data=titanic_df, x='age', y='class', ax=axes[0,0])
axes[0,0].set_title("不同舱位乘客年龄分布")

# 图2:结合生存状态的分组箱线图
sns.boxplot(data=titanic_df, x='class', y='age', hue='alive', ax=axes[0,1])
axes[0,1].set_title("存活状态下的年龄分布对比")

# 图3:多个数值列横向对比
numeric_data = titanic_df[['age', 'fare']].melt()
sns.boxplot(data=numeric_data, x='value', y='variable', orient='h', ax=axes[0,2])
axes[0,2].set_title("年龄与票价分布对比")

# 图4:甲板编号对票价的影响(重叠显示)
sns.boxplot(data=titanic_df, x='fare', y='deck', hue='deck', dodge=False, ax=axes[1,0])
axes[1,0].set_title("各甲板票价分布(无偏移)")

# 图5:自定义排序后的分布图
order = ['G', 'F', 'E', 'D', 'C', 'B', 'A']
sns.boxplot(data=titanic_df, x='fare', y='deck', order=order, hue='deck', dodge=False, ax=axes[1,1])
axes[1,1].set_title("按甲板倒序排列的票价分布")

# 图6:启用缺口并自定义中位线样式
sns.boxplot(
    data=titanic_df, x='age', y='class',
    notch=True, showcaps=False,
    medianprops={'color': 'crimson', 'linewidth': 2.5},
    flierprops={'marker': 's', 'markersize': 5},
    ax=axes[1,2]
)
axes[1,2].set_title("带缺口的年龄分布图")

for ax in axes.flat:
    ax.grid(axis='x', linestyle='--', alpha=0.6)

plt.tight_layout()
plt.show()
Seaborn箱线图输出结果

注意:若出现 sns.load_dataset("titanic") 加载失败的情况,可能是网络问题导致远程资源无法获取,建议手动下载数据文件并本地加载。

标签: Matplotlib

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。