Matplotlib boxplot仅显示最大和最小传单

PJW*_*PJW 6 python matplotlib boxplot

我正在使用plt.boxplot()命令制作标准的Matplotlib箱图.我创建boxplot的代码行是:

bp = plt.boxplot(data, whis=[5, 95], showfliers=True)
Run Code Online (Sandbox Code Playgroud)

因为我的数据分布很大,所以我在胡须的范围之外得到了很多传单.为了获得更清晰的出版质量情节,我想只展示单个传单.而在最低点.数据的值,而不是所有传单.这可能吗?我没有在文档中看到任何内置选项来执行此操作.

(我可以将胡须的范围设置为最大/分钟,但这不是我想要的.我想将胡须保持在第5和第95百分位).

下面是我正在研究的数字.注意飞行员的密度. 盒形图

Geo*_*tob 4

plt.boxplot()返回一个字典,其中键fliers包含作为 line2d 对象的上部和下部飞行器。您可以在绘制之前操纵它们,如下所示:

仅适用于 matplotlib >= 1.4.0

bp = plt.boxplot(data, whis=[5, 95], showfliers=True)

# Get a list of Line2D objects, representing a single line from the
# minimum to the maximum flier points.
fliers = bp['fliers']

# Iterate over it!
for fly in fliers:
    fdata = fly.get_data()
    fly.set_data([fdata[0][0],fdata[0][-1]],[fdata[1][0],fdata[1][-1]])
Run Code Online (Sandbox Code Playgroud)

在旧版本上

如果您使用的是较旧版本的 matplotlib,则每个箱线图的传单均由行而不是一行表示。因此,循环看起来像这样:

import numpy as np
for i in range(len(fliers)):
    fdata = fliers[i].get_data()
    # Get the index of the maximum y in data if 
    # i is 0 or even, else get index of minimum y.
    if i%2 == 0:
        id = np.where(fdata[1] == fdata[1].max())[0][0]
    else:
        id = np.where(fdata[1] == fdata[1].min())[0][0]
    fliers[i].set_data([fdata[0][id], fdata[1][id]])
Run Code Online (Sandbox Code Playgroud)

另请注意,该showfliers参数在 matplotlib <1.4x 中不存在,并且该whisk参数不接受列表。

当然(对于简单的应用程序),您可以绘制没有传单的箱线图,并将最大和最小点添加到图中:

bp = plt.boxplot(data, whis=[5, 95], showfliers=False)
sc = plt.scatter([1, 1], [data.min(), data.max()])
Run Code Online (Sandbox Code Playgroud)

其中[1, 1]是点的 x 位置。