首页 > 编程笔记 > Python笔记 阅读:7

Matplotlib boxplot()绘制箱型图(附带实例)

箱形图又称箱线图、盒须图或盒式图,它是一种用来显示一组数据离散情况的统计图因形状像箱子而得名。

箱形图最大的优点就是不受异常值的影响(异常值也称为离群值),可以以一种相对稳定的方式描述数据的离散情况,因此在各领域中被广泛使用。另外,箱形图也常用于异常值的识别。

Matplotlib 绘制箱形图主要使用 boxplot() 函数,语法格式如下:
matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None, labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None)
参数说明见下表:

参数 说明
x 要绘制成箱形图的数据。
notch 指定是否以凹口的形式展示箱形图,默认为非凹口。
sym 指定异常点的形状,默认用“+”显示。
vert 指定是否需要将箱形图垂直摆放,默认垂直摆放。
whis 指定上下限与上下四分位数的距离,默认为 1.5 倍的四分位差。
positions 指定箱形图中箱体的位置,默认为 [0, 1, 2, …]。
widths 指定箱形图中箱体的宽度,默认值为 0.5。
patch_artist 指定是否填充箱体的颜色。
meanline 指定是否用线的形式表示均值,默认用点来表示。
showmeans 指定是否显示均值,默认不显示。
showcaps 指定是否显示箱形图顶端和末端的两条线,默认显示。
showbox 指定是否显示箱形图的箱体,默认显示。
showfliers 指定是否显示异常值,默认显示。
boxprops 设置箱体的属性,如边框色、填充色等。
labels 为箱形图添加标签,类似于图例的作用。
flierprops 设置异常值的属性,如异常值点的形状、大小、填充色等。
medianprops 设置中位数的属性,如线的类型、粗细等。
meanprops 设置均值的属性,如点的大小、颜色等。
capprops 设置箱形图顶端和末端线条的属性,如颜色、粗细等。
whiskerprops 设置须的属性,如颜色、粗细、线的类型等。

【实例 1】绘制简单箱形图,程序代码如下:
# 导入matplotlib模块
import matplotlib.pyplot as plt
x=[1,2,3,5,7,9]    # x轴数据
plt.boxplot(x)      # 箱形图
plt.show()          # 显示图表
运行程序,结果如下图所示:


图 1 简单箱形图

上述示例是一组数据的箱形图,还可以绘制多组数据的箱形图,需要指定多组数据。例如,为三组数据绘制箱形图,主要代码如下:
# 箱形图的数据
x1=[1,2,3,5,7,9];x2=[10,22,13,15,8,19];x3=[18,31,18,19,14,29]
plt.boxplot([x1,x2,x3])  # 箱形图
plt.show()              # 显示图表
运行结果,结果如下图所示:


图 2 多组数据的箱形图

箱形图将数据切割分离(实际上就是将数据分为四部分),如下图所示:


图 3 箱形图的组成

下面介绍箱形图每部分的具体含义及如何通过箱形图判断异常值。
其中,Q3-Q1 表示四分位差。如果使用箱形图判断异常值,其判断标准是,当变量的数据值大于箱形图的上限或者小于箱线图的下限时,就可以将这样的数据值判定为异常值。

下面介绍判断异常值的标准,如下图所示:


图 4 异常值判断标准

【实例 2】通过箱形图查找客人总消费数据中存在的异常值,程序代码如下:
import matplotlib.pyplot as plt
import pandas as pd

df=pd.read_excel('../datas/tips.xlsx')
plt.boxplot(x = df['总消费'], # 指定绘制箱形图的数据
            whis = 1.5, # 指定1.5倍的四分位差
            widths = 0.3, # 指定箱形图中箱体的宽度为0.3
            patch_artist = True, # 填充箱体颜色
            showmeans = True, # 显示均值
            boxprops = {'facecolor':'RoyalBlue'}, # 指定箱体的填充色为宝蓝色
            # 指定异常值的填充色、边框色和大小
            flierprops={'markerfacecolor':'red','markeredgecolor':'red','markersize':3},
            # 指定中位数的标记符号(虚线)和颜色
            meanprops = {'marker':'h','markerfacecolor':'black','markersize':8},
            # 指定均值的标记符号(六边形)、填充色和大小
            medianprops = {'linestyle':'--','color':'orange'},
            labels = ['']) # 去除x轴刻度值
plt.show() # 显示图表

# 计算下四分位数和上四分位数
Q1 = df['总消费'].quantile(q = 0.25)
Q3 = df['总消费'].quantile(q = 0.75)
# 基于1.5倍的四分位差计算上下限对应的值
low_limit = Q1 - 1.5*(Q3 - Q1)
up_limit = Q3 + 1.5*(Q3 - Q1)
# 查找异常值
val=df['总消费'][(df['总消费'] > up_limit) | (df['总消费'] < low_limit)]
print('异常值如下:')
print(val)
运行程序,输出结果为:

异常值如下:
26    44.30
77    43.11
131    48.27
163    48.17
171    50.81
182    45.35
184    40.55
194    48.33
230    41.19
Name: 总消费, dtype: float64


绘制的箱型图如下:


图 5 箱形图

相关文章