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

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

相较散点图和折线图,柱状图、饼图、箱线图(箱型图)是另外 3 种数据分析常用的图形,主要用于分析数据内部的分布状态或分散状态。其中箱线图(箱型图)的主要作用是发现数据内部整体的分布分散情况,包括上下限、各分位数、异常值。

Matplotlib 中绘制箱线图的函数为 boxplot(),函数的格式为:
plt.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 设置须的属性,如颜色、粗细、线的类型等。

【实例】利用 plt.boxplot() 函数绘制各种类型的箱线图。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.patches import Polygon
# 固定随机状态以实现再现性
np.random.seed(19680801)

# 给定数据
spread = np.random.rand(50) * 100
center = np.ones(25) * 50
flier_high = np.random.rand(10) * 100 + 100
flier_low = np.random.rand(10) * -100
data = np.concatenate((spread, center, flier_high, flier_low))
fig, axs = plt.subplots(2, 3)
# 基本绘图
axs[0, 0].boxplot(data)
axs[0, 0].set_title('基本绘图')
# 缺口图
axs[0, 1].boxplot(data, 1)
axs[0, 1].set_title('缺口图')
# 更改异常点符号
axs[0, 2].boxplot(data, 0, 'gD')
axs[0, 2].set_title('更改异常点符号')
# 不显示异常点
axs[1, 0].boxplot(data, 0, '')
axs[1, 0].set_title("不显示异常点")
# 水平箱线图
axs[1, 1].boxplot(data, 0, 'rs', 0)
axs[1, 1].set_title('水平箱线图')
# 改变 whisker 长度
axs[1, 2].boxplot(data, 'rs', 0, 0.75)
axs[1, 2].set_title('改变 whisker 长度')
fig.subplots_adjust(left=0.08, right=0.98, bottom=0.05, top=0.9, hspace=0.4, wspace=0.3)

# 创建更多数据
spread = np.random.rand(50) * 100
center = np.ones(25) * 40
flier_high = np.random.rand(10) * 100 + 100
flier_low = np.random.rand(10) * -100
d2 = np.concatenate((spread, center, flier_high, flier_low))
data.shape = (-1, 1)
d2.shape = (-1, 1)
# 制作二维数组仅在所有列长度相同时才有效。如果不是,则使用列表代替
data = [data, d2, d2[:, :2, 0]]
# 一个轴上多个箱线图
fig, ax = plt.subplots()
ax.boxplot(data)
plt.show()
运行程序,效果如下图所示:


图 1 各种类型箱线图


图 2 一轴多个箱线图

相关文章