将列表自动分为二进制位图

时间:2017-07-13 11:17:06

标签: python matplotlib

我想将一个数字列表绘制为带有Matplot的直方图,x轴显示二进制位,y轴显示每个二进制包含多少个值(不是数字的总和)。我的目标是根据列表中的数据自动生成每个bin中包含的数字间隔。

例如,如果这个列表:[1,3,8,9,9,4,20,3,10,24,80,2,45,2,100,25],那么我想象一下有4个箱子,如1-10,10-20,20-50,50 +是有意义的。例如。如果列表看起来不同,数字范围更广,那么6个箱子可能更好,也许每个箱子中的数字间隔会更大。

我怎么能这样做?我怀疑numpy或Pandas可能会这样做,但我是数据可视化领域的初学者,所以我还没有能够自己解决这个问题。

这是我目前用于手动分箱的非常原始的代码(然后我把它交给Matplot)。我知道我可以用更好的Python代码缩短它,但我怀疑像这样手动分箱并不是最好的方法。

# example values, list with time stamps in minutes
list_with_minutes =  [1,3,8,9,9,4,20,3,10,24,80,2,45,2,100,25]


bin1 = 0
bin2 = 0
bin3 = 0
bin4 = 0
bin5 = 0
bin6 = 0
bin7 = 0

for value in list_with_minutes:
    if value <= 5:
        bin1 += 1
    if value >= 6 and value <= 10:
        bin2 += 1
    if value >= 11 and value <= 30:
        bin3 += 1
    if value >= 31 and value <= 60:
        bin4 += 1
    if value >= 61 and value <= 120:
        bin5 += 1
    if value >= 121 and value <= 240:
        bin6 += 1
    if value >= 241:
        bin7 += 1

minute_bins = [1,2,3,4,5,6,7]
number_of_posts_list = [bin1,bin2,bin3,bin4,bin5,bin6,bin7]

感谢。

编辑,因为这个问题被认为是一个可能的dublicate:我的问题不是&#34;如何使用numpy的直方图一般工作&#34;,但如何以某种自动方式对数字列表进行分类取决于数字的范围,性质和数量。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望使用任意间隔的bin边界实现自己的binning。如果是这样的话可以帮助你;

from collections import defaultdict

list_with_minutes = [1, 3, 8, 9, 9, 4, 20, 3, 10, 24, 80, 2, 45, 2, 100, 25]
bin_boundaries = [(0, 10),
                  (10, 20),
                  (20, 50),
                  (50, max(list_with_minutes))]
bin_counts = defaultdict(int)

for value in list_with_minutes:
    for low, high in bin_boundaries:
        if low < value <= high:
            bin_counts[(low, high)] += 1

print(bin_counts)
# defaultdict(<type 'int'>, {(50, 100): 2, (20, 50): 3, (0, 10): 10, (10, 20): 1})
print(bin_counts[(0, 10)])              # 10
print(bin_counts[bin_boundaries[2]])    # 3