Matplotlib boxplot() 函数
boxplot() 用于绘制箱线图,直观展示数据的五数概括:最小值、第一四分位数、中位数、第三四分位数、最大值,以及可能的异常值。
箱线图是数据探索分析的核心工具,适合对比多组数据的分布特征。
函数定义
matplotlib.pyplot.boxplot(x, notch=None, sym=None, vert=None,
whis=None, positions=None, widths=None, patch_artist=None,
bootstrap=None, usermedians=None, conf_intervals=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, manage_ticks=True, autorange=False,
zorder=None, capwidths=None, **kwargs)
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| x | array 或 array 序列 | 输入数据,一维数组绘制一个箱线,二维数组序列绘制多个 |
| notch | bool | 是否绘制缺口箱线图(缺口用于中位数置信区间),默认 False |
| vert | bool | True=垂直(默认),False=水平 |
| whis | float 或 (float, float) | 须线长度(IQR 的倍数),默认 1.5。如 (5, 95) 表示第 5 和 95 百分位 |
| sym | str 或 None | 异常值的标记样式,None 表示不显示异常值 |
| widths | float 或 array-like | 每个箱线的宽度 |
| patch_artist | bool | 若为 True,箱子用填充色(可用 facecolor 自定义) |
| showmeans | bool | 是否显示均值点,默认 False |
| showfliers | bool | 是否显示异常值,默认 True |
| labels | list | 每个箱线的标签 |
| boxprops / flierprops / medianprops / meanprops | dict | 分别控制箱子/异常值/中位线/均值的外观属性 |
箱线图的结构:箱子从 Q1 到 Q3,中间线是中位数。须线延伸至 Q1-1.5*IQR 到 Q3+1.5*IQR 范围内最远的数据点。超出须线的值为异常值。
使用示例
示例 1:基本箱线图
实例
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
# 三组不同分布的数据
data = [
np.random.normal(0, 1, 100), # 标准正态
np.random.normal(2, 1.5, 100), # 均值=2, 标准差=1.5
np.random.normal(-1, 0.5, 100), # 均值=-1, 标准差=0.5
]
fig, ax = plt.subplots(figsize=(7, 5), layout='constrained')
bp = ax.boxplot(data, labels=['Group A', 'Group B', 'Group C'],
patch_artist=True)
# 自定义颜色
colors = ['#3498db', '#e74c3c', '#2ecc71']
for patch, color in zip(bp['boxes'], colors):
patch.set_facecolor(color)
ax.set_title('Box Plot: Comparing Three Groups')
ax.set_ylabel('Value')
ax.grid(axis='y', alpha=0.3)
plt.show()
import numpy as np
np.random.seed(42)
# 三组不同分布的数据
data = [
np.random.normal(0, 1, 100), # 标准正态
np.random.normal(2, 1.5, 100), # 均值=2, 标准差=1.5
np.random.normal(-1, 0.5, 100), # 均值=-1, 标准差=0.5
]
fig, ax = plt.subplots(figsize=(7, 5), layout='constrained')
bp = ax.boxplot(data, labels=['Group A', 'Group B', 'Group C'],
patch_artist=True)
# 自定义颜色
colors = ['#3498db', '#e74c3c', '#2ecc71']
for patch, color in zip(bp['boxes'], colors):
patch.set_facecolor(color)
ax.set_title('Box Plot: Comparing Three Groups')
ax.set_ylabel('Value')
ax.grid(axis='y', alpha=0.3)
plt.show()
示例 2:缺口箱线图 + 显示均值
实例
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
data = [
np.random.normal(0, 1, 100),
np.random.normal(0, 1.2, 100),
np.random.normal(0.3, 1, 100),
]
fig, ax = plt.subplots(figsize=(7, 5), layout='constrained')
bp = ax.boxplot(data,
notch=True, # 缺口(中位数置信区间)
showmeans=True, # 显示均值
meanprops=dict(marker='D', markerfacecolor='red',
markersize=8),
patch_artist=True,
labels=['Control', 'Test A', 'Test B'])
colors = ['#bdc3c7', '#3498db', '#2ecc71']
for patch, color in zip(bp['boxes'], colors):
patch.set_facecolor(color)
ax.set_title('Notched Box Plot with Means')
ax.set_ylabel('Measurement')
ax.grid(axis='y', alpha=0.3)
plt.show()
import numpy as np
np.random.seed(42)
data = [
np.random.normal(0, 1, 100),
np.random.normal(0, 1.2, 100),
np.random.normal(0.3, 1, 100),
]
fig, ax = plt.subplots(figsize=(7, 5), layout='constrained')
bp = ax.boxplot(data,
notch=True, # 缺口(中位数置信区间)
showmeans=True, # 显示均值
meanprops=dict(marker='D', markerfacecolor='red',
markersize=8),
patch_artist=True,
labels=['Control', 'Test A', 'Test B'])
colors = ['#bdc3c7', '#3498db', '#2ecc71']
for patch, color in zip(bp['boxes'], colors):
patch.set_facecolor(color)
ax.set_title('Notched Box Plot with Means')
ax.set_ylabel('Measurement')
ax.grid(axis='y', alpha=0.3)
plt.show()
示例 3:水平箱线图
实例
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
data = [np.random.exponential(scale=s, size=100) for s in [1, 2, 3, 4]]
labels = ['Scale=1', 'Scale=2', 'Scale=3', 'Scale=4']
fig, ax = plt.subplots(figsize=(8, 5), layout='constrained')
bp = ax.boxplot(data, labels=labels,
vert=False, # 水平方向
patch_artist=True)
colors = ['#e74c3c', '#f39c12', '#2ecc71', '#3498db']
for patch, color in zip(bp['boxes'], colors):
patch.set_facecolor(color)
patch.set_alpha(0.7)
ax.set_title('Horizontal Box Plot')
ax.set_xlabel('Value')
ax.grid(axis='x', alpha=0.3)
plt.show()
import numpy as np
np.random.seed(42)
data = [np.random.exponential(scale=s, size=100) for s in [1, 2, 3, 4]]
labels = ['Scale=1', 'Scale=2', 'Scale=3', 'Scale=4']
fig, ax = plt.subplots(figsize=(8, 5), layout='constrained')
bp = ax.boxplot(data, labels=labels,
vert=False, # 水平方向
patch_artist=True)
colors = ['#e74c3c', '#f39c12', '#2ecc71', '#3498db']
for patch, color in zip(bp['boxes'], colors):
patch.set_facecolor(color)
patch.set_alpha(0.7)
ax.set_title('Horizontal Box Plot')
ax.set_xlabel('Value')
ax.grid(axis='x', alpha=0.3)
plt.show()
常见问题
箱线图各部分的含义?
箱子:Q1(25%)到 Q3(75%)的 IQR(四分位距)。
中位线:箱子中间的线 = Q2(50%)。
须线:延伸到 Q1-1.5*IQR 和 Q3+1.5*IQR 内最远的数据点。
异常值:须线范围之外的独立数据点。
Matplotlib 参考文档
点我分享笔记