盒子图python

admin 106 0
盒子图(箱线图)是Python中常用的统计可视化工具,用于展示数据的分布特征,通过Matplotlib的boxplot()或Seaborn的boxplot()函数,可快速绘制箱线图,其核心组成部分包括箱体(表示四分位距IQR)、中位线、须线(延伸至1.5倍IQR或最值)及异常值点,该图表能有效识别数据集中位数、离散程度和异常值,适合单变量或多组数据分布对比分析,Seaborn还支持按分组变量着色、调整箱体宽度等,增强可视化表现力,是数据探索阶段分析数据分布规律的利器。

Python数据可视化利器:从零掌握箱线图绘制与解读

在数据分析流程中,快速洞察数据分布特征(如中心趋势、离散程度、异常值)是探索性数据分析(EDA)的核心任务。**箱线图(Box Plot)** 作为经典的可视化工具,通过简洁的图形语言直观呈现数据的五数概括(最小值、第一四分位数Q1、中位数、第三四分位数Q3、最大值),并精准识别异常值,借助Python的Matplotlib与Seaborn库,绘制箱线图仅需数行代码,本文将系统讲解箱线图的原理、绘制方法、参数定制及实战应用,助您从零掌握这一数据分析利器。

箱线图的核心:解密数据的“五维密码”

深入理解箱线图的构成(以垂直箱线图为例)是正确解读数据的关键:

  • 箱体(Box):核心数据分布区间,上边界为**第三四分位数(Q3,75%分位数)**,下边界为**第一四分位数(Q1,25%分位数)**,箱体高度即**四分位距(IQR=Q3-Q1)**,覆盖数据中间50%的集中范围。
  • 中位线(Median):箱体内的水平线,代表**中位数(50%分位数)**,是衡量数据中心趋势的核心指标,若中位线偏离箱体中心,提示数据存在偏态分布。
  • 须(Whiskers):从箱体延伸的垂直线,默认范围至**Q1-1.5×IQR**(下须)和**Q3+1.5×IQR**(上须)内的最远数据点,须线长度反映数据分布的离散程度。
  • 异常值(Outliers):须线范围外的离散点,通常以圆点或星号标记,需结合业务场景判断是否为极端值或数据错误。

通过箱线图可快速判断:数据对称性(中位线位置)、分布偏态(左右须线长度)、异常值密度,并高效对比多组数据的分布差异。

Python实战:从基础绘图到高级定制

Python生态中,**Matplotlib**提供底层绘图能力,**Seaborn**封装了更优雅的统计可视化接口,以下通过案例演示完整流程。

基础绘图:Matplotlib单组箱线图

使用`boxplot()`函数绘制正态分布数据的箱线图,并自定义视觉样式:

import numpy as np
import matplotlib.pyplot as plt

生成模拟数据:100个正态分布随机数(均值0,标准差1)

data = np.random.normal(0, 1, 100)

创建画布

plt.figure(figsize=(6, 8))

绘制定制化箱线图

plt.boxplot( data, patch_artist=True, # 启用箱体填充 boxprops=dict(facecolor='lightblue', color='blue'), # 箱体样式 medianprops=dict(color='red', linewidth=2), # 中位线样式 whiskerprops=dict(color='green', linewidth=1.5), # 须线样式 capprops=dict(color='black'), # 须线端帽样式 flierprops=dict(marker='o', markerfacecolor='red', markersize=5) # 异常值样式 ) 与标签'基础箱线图示例', fontsize=14) plt.ylabel('数值', fontsize=12) plt.grid(axis='y', linestyle='--', alpha=0.7) # 水平网格线 plt.show()

参数解析

  • `patch_artist=True`:启用箱体填充功能(默认仅绘制边框)
  • `*_props`参数:通过字典格式控制各组件的视觉属性(颜色、线宽、标记样式等)
  • 输出结果:蓝色箱体、红色中位线、绿色须线、红色异常值标记(若存在)
多组对比:Seaborn分组箱线图

通过Seaborn的`boxplot()`高效实现多组数据对比,以"小费数据集"为例分析不同星期账单分布:

import seaborn as sns
import matplotlib.pyplot as plt

加载内置数据集

tips = sns.load_dataset('tips')

创建画布

plt.figure(figsize=(10, 6))

绘制分组箱线图

sns.boxplot( x='day', # 分组变量(x轴) y='total_bill', # 数值变量(y轴) data=tips, # 数据源 palette='Set2', # 调色板 width=0.6, # 箱体宽度 showfliers=True # 显示异常值(默认True) ) 与标签'不同星期总账单分布对比', fontsize=14) plt.xlabel('星期', fontsize=12) plt.ylabel('总账单(美元)', fontsize=12) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()

结果解读

  • **星期四(Thur)**:账单分布最集中(箱体最窄),中位数最低,异常值较少
  • **星期日(Sun)**:账单整体偏高(箱体上移),离散程度最大(须线最长),存在多个高值异常点
  • **星期六(Sat)**:分布特征与周日相似,但中位数略低
  • **星期五(Fri)**:数据量最少,分布特征需谨慎解读
高级定制:多维度分组与样式优化

通过`hue`参数实现分组变量嵌套,并优化视觉呈现:

plt.figure(figsize=(12, 7))

按星期+性别分组,添加均值标记

sns.boxplot( x='day', y='total_bill', hue='sex', # 二级分组变量 data=tips, palette='pastel', width=0.6, showmeans=True, # 显示均值标记 meanprops=dict(marker='D', markerfacecolor='black', markeredgecolor='black') ) '按星期与性别分组的账单分布', fontsize=14) plt.xlabel('星期', fontsize=12) plt.ylabel('总账单(美元)', fontsize=12

标签: #boxplot python