Matplotlib 箱线图(boxplot)仅显示最大值和最小值
在本文中,我们将探讨Matplotlib中的箱线图(boxplot)只显示最大值和最小值的情况,并提供相应的解决方案。
阅读更多:Matplotlib 教程
箱线图(boxplot)简介
箱线图(boxplot)是一种用于展示数据分布情况的图表。生成一个箱线图时,会将数据分为四分位数(q1、q2、q3)和异常值(outliers)等几部分。其中,箱体表示围绕数据的50%的值范围(即q2与q3之间),箱线表示数据的25%的值范围(即q1与q2之间)。异常值则是数据中远离中心足够远的值。常规情况下,箱线图会同时显示箱体、箱线和异常值的位置,并为用户提供更多的信息。
在Matplotlib中,可以使用matplotlib.pyplot.boxplot函数创建一个箱线图,并利用showfliers参数控制是否显示异常值。具体而言,当showfliers=True时,会将所有的异常值都显示出来;当showfliers=False时,只会显示所有数据中较小的异常值和较大的异常值(即最小值和最大值)。
问题描述
然而,在某些情况下,我们会遇到这样的问题:利用Matplotlib创建箱线图时,即使将showfliers设为False,仍然会产生一个非常大的异常值(例如1e10),导致整个图表的缩放失真。这时,我们只能放弃控制异常值的显示,仅显示最小值和最大值,如下图所示:
import matplotlib.pyplot as plt
import numpy as np
# 创建一组数据
np.random.seed(1)
data = np.random.normal(loc=0.0, scale=1.0, size=(1000,))
# 创建箱线图(仅显示最小值和最大值)
fig, ax = plt.subplots()
ax.boxplot(data, showfliers=False)
plt.show()
可以看到,这时的箱线图只显示了最小值和最大值,而箱体和箱线都被省略了。
解决方案
为了解决这个问题,我们需要将异常值的范围缩小到最小和最大值之间,同时保持箱体和箱线的显示。具体而言,我们可以将数据中的大于最大值或小于最小值的值都替换为相应的最大值或最小值。下面是这个解决方案的代码示例:
def boxplot(showfliers=False, **kw):
def plot(x, y, **kw):
fig, ax = plt.subplots()
# 根据showfliers参数,选择是否显示异常值
options = {'showfliers': showfliers}
options.update(kw)
# 创建箱线图
ax.boxplot(y, **options)
# 确定y轴上下限
ymin, ymax = ax.get_ylim()
yrange = ymax - ymin
# 用最小值和最大值修正异常值的范围
whiskers = [whiskers.get_ydata() for whiskers in ax.artists if isinstance(whiskers, mpl.lines.Line2D)]
whiskers.sort(key=lambda x: x[0])
ymin = min(ymin, whiskers[0][0])
ymax = max(ymax, whiskers[-1][1])
whiskers[0][0], whiskers[-1][1] = ymin, ymax
# 更新y轴上下限
ax.set_ylim(ymin - 0.05 * yrange, ymax + 0.05 * yrange)
# 显示箱体和箱线
for box in ax.artists:
box.set_facecolor('white')
box.set_edgecolor('black')
box.set_linewidth(1.5)
plt.show()
return plot
# 创建一组数据
np.random.seed(1)
data = np.random.normal(loc=0.0, scale=1.0, size=(1000,))
# 创建修正后的箱线图(仅显示最小值和最大值)
plot = boxplot(showfliers=False)
plot(data)
这段代码中,我们定义了一个名为boxplot的函数,它接受一个showfliers参数用于控制是否显示异常值,并返回一个名为plot的内部函数。内部函数用于创建并显示箱线图。具体而言,它会根据showfliers参数创建一个箱线图,在绘图完成后,通过遍历数据集内的箱线线段对象、获取最小值和最大值的位置、计算修正后的箱线刻度、显示修正后的箱线图。
使用上述代码,我们可以获得一个仅显示最小值和最大值的修正箱线图,同时保持箱体和箱线的显示:
总结
本文介绍了Matplotlib箱线图中仅显示最大值和最小值的现象,并提供了一种解决方案。如果您在使用Matplotlib创建箱线图时遇到类似的问题,请参考本文提供的代码示例进行修正。
极客笔记