数据点相对较少的直方图的bin选择

时间:2019-02-08 19:56:15

标签: python matplotlib histogram binning

考虑具有多个histograms in matplotlib的地块,如下所示:

#! /usr/bin/env python3
import matplotlib.pyplot as plt
import random

# Use the same seed for reproducibility.
random.seed(10586)

data1 = [random.gauss(1e-4, 3e-2) for _ in range(10**3)] + [0.3]
data2 = [random.gauss(1e-2, 3e-3) for _ in range(10**3)] + [0.4]
data3 = [0.2]

if __name__ == '__main__':
    plt.xlim(xmin=0, xmax=0.8)
    plt.yscale('log')
    n1, bins1, patches1 = plt.hist(data1, bins='auto', alpha=0.6)
    n2, bins2, patches2 = plt.hist(data2, bins='auto', alpha=0.6)
    n3, bins3, patches3 = plt.hist(data3, bins='auto', alpha=0.6)
    bin_options = ['auto', 'fd', 'doane', 'scott', 'rice', 'sturges', 'sqrt']
    plt.show()

但是,第三个数据集只有一个数据点, 所以当我们使用plt.hist(data3, bins='auto') 我们会在x范围内看到一条长条, 并且不再看到其值为0.2:

stretched out

(只有一个数据点最明显, 但这是一个问题还有两个或三个。)

避免这种情况的一种方法是仅重复使用另一个数据集的垃圾箱。 例如,对于plt.hist(data3, bins=bins1), 我们可以看到data3很好:

what we want

但是,如果我们通过bins=bins2使用其他数据集, 垃圾箱太窄,我们根本看不到data3

all gone

我们如何确保显示相对较少点的直方图, 但仍在x轴上看到它的值?

1 个答案:

答案 0 :(得分:1)

为了确保您能看到条形图,即使它太窄而不能包含一个像素,也可以为其设置边缘颜色

import matplotlib.pyplot as plt
import random
random.seed(10586)

data2 = [random.gauss(1e-2, 3e-3) for _ in range(10**3)] + [0.4]

plt.xlim(0, 0.8)
plt.yscale('log')

n2, bins2, patches2 = plt.hist(data2, bins='auto', alpha=0.6, edgecolor="C0")

plt.show()

enter image description here

或者使用histtype="stepfilled"创建多边形,因为单个条形图无论如何也无法与那么多箱形图区别开来,

n2, bins2, patches2 = plt.hist(data2, bins='auto', alpha=0.6, histtype="stepfilled")

enter image description here

后者也具有服从alpha的优势,否则由于条形重叠而无法看到。同样,绘制单个形状应该更快,而不是大约1000条。