shevonWang's Blog

Python 箱形图

“箱形图”(boxplot)也叫”盒须图”或”箱须图(Box-whiskerPlot)”。

箱形图可以识别数据异常值,判断数据偏态和尾重,比较几批数据的形状。

箱形图提供了识别异常值的一个标准:异常值通常被定义为小于 \(Q_L - 1.5IQR\) 或大于 \(Q_U + 1.5IQR\) 的值。 \(Q_L\) 称为下四分位数,表示全部观察值中,有四分之一的数据取值比它小; \(Q_U\) 称为上四分位数,表示所有观察值中,有四分之一的数据取值比它大;\(IQR\) 称为四分位数间距,是上四分位数 \(Q_U\) 与下四分位数 \(Q_L\) 之差,其间包含了全部观察值的一半。

在 python 里使用 matplotlib.pyplot.boxplot() 生成箱形图。

将每列或每个向量在序列 x 中生成箱形图。箱子中的框,从数据的低四分位数值延伸到高四分位数值,在 medians 中间值处有一条线。 whiskers 从盒子延伸以显示数据的范围,是从 box 到 error bar 之间的竖线。 fliers 是那些超过了 whiskers 的异常点。 caps 指 error bar 横线。详细介绍链接 在这里 .。

python 示例:

#!usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号

np.random.seed(10) #设置随机种子
data = np.random.normal(100, 40, 200)
p = plt.boxplot(data)

#改变 fliers 的风格和填充
for flier in p['fliers']:
    flier.set(marker='o', color='#e7298a', alpha=0.5)

x = p['fliers'][0].get_xdata() # 'flies'即为异常值的标签
y = p['fliers'][0].get_ydata()

#用annotate添加注释
#其中有些相近的点,注解会出现重叠,难以看清,需要一些技巧来控制。
#以下参数都是经过调试的,需要具体问题具体调试。
for i in range(len(x)):
    if i > 0:
        plt.annotate(y[i], xy=(x[i], y[i]), xytext=(x[i]+0.05 -1.25/(y[i]-y[i-1]), y[i]))
    else:
        plt.annotate(y[i], xy=(x[i], y[i]))

plt.show() #展示箱线图

运行结果: