📜  Matplotlib 直方图中的 bin 大小

📅  最后修改于: 2022-05-13 01:54:35.520000             🧑  作者: Mango

Matplotlib 直方图中的 bin 大小

先决条件: Matplotlib

直方图是用户给出的数据分布的图形表示。它的外观类似于条形图,只是它是连续的。

直方图的塔或条称为箱。每个 bin 的高度显示该数据中有多少值落入该范围。

要在直方图中创建的 bin 数量的默认值为 10。但是,我们可以使用matplotlib.pyplot.hist() 中的参数 bins 更改 bin 的大小。

方法一:

我们可以在 bins 中传递一个整数,说明要在直方图中创建多少个 bins/tower,然后相应地更改每个 bin 的宽度。

示例 1:

Python3
import matplotlib.pyplot as plt
  
height = [189, 185, 195, 149, 189, 147, 154, 
          174, 169, 195, 159, 192, 155, 191, 
          153, 157, 140, 144, 172, 157, 181, 
          182, 166, 167]
  
plt.hist(height, edgecolor="red", bins=5)
plt.show()


Python3
import matplotlib.pyplot as plt
  
values = [87, 53, 66, 61, 67, 68, 62,
          110, 104, 61, 111, 123, 117,
          119, 116, 104, 92, 111, 90,
          103, 81, 80, 101, 51, 79, 107,
          110, 129, 145, 139, 110]
  
plt.hist(values, bins=7, edgecolor="yellow", color="green")
plt.show()


Python3
import matplotlib.pyplot as plt
  
marks = [1, 2, 3, 2, 1, 2, 3, 2, 
         1, 4, 5, 4, 3, 2, 5, 4, 
         5, 4, 5, 3, 2, 1, 5]
  
plt.hist(marks, bins=[1, 2, 3, 4, 5], edgecolor="black")
plt.show()


Python3
import matplotlib.pyplot as plt
  
data = [189, 185, 195, 149, 189, 147,
        154, 174, 169, 195, 159, 192,
        155, 191, 153, 157, 140, 144, 
        172, 157, 181, 182, 166, 167]
  
plt.hist(data, bins=[140, 150, 160, 175, 185, 200],
         edgecolor="yellow", color="grey")
  
plt.show()


Python3
import matplotlib.pyplot as plt
  
data = [87, 53, 66, 61, 67, 68, 62, 110,
        104, 61, 111, 123, 117, 119, 116,
        104, 92, 111, 90, 103, 81, 80, 101,
        51, 79, 107, 110, 129, 145, 128, 
        132, 135, 131, 126, 139, 110]
  
binwidth = 8
plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth),
         edgecolor="yellow", color="brown")
  
plt.show()


输出 :

这里,bins = 5,即要创建的bins 的数量是5。将bins 设置为整数会创建大小或宽度相等的bins。随着 bin 大小的变化,bin 宽度将相应地更改为:

宽度 = (195 – 140) / 5 = 11

示例 2:

蟒蛇3

import matplotlib.pyplot as plt
  
values = [87, 53, 66, 61, 67, 68, 62,
          110, 104, 61, 111, 123, 117,
          119, 116, 104, 92, 111, 90,
          103, 81, 80, 101, 51, 79, 107,
          110, 129, 145, 139, 110]
  
plt.hist(values, bins=7, edgecolor="yellow", color="green")
plt.show()

输出 :

在上图中,每个 bin 的宽度为:

宽度 = ( 145 – 51 ) / 7 = 13.4

方法二:

我们还可以在参数 bin 中传递一个 int 或 float 序列。其中序列的元素是 bin 的边缘/边界。在这种方法中,每个 bin 的 bin 宽度可能不同。

假设一个序列 [1,2,3,4,5] 被分配给 bin,然后产生的 bin 数量将为 4,即第一个 bin 将为 [1,2)(包括 1,但不包括 2)第二个 bin 将为 [2,3)(包括 2,但不包括 3)第三个 bin 将是 [3,4)(包括 3,但不包括 4)。然而,在最后一个 bin [4,5] 中,4 和 5 都包含在内。

因此,所有的 bin 都是半开的 [a, b) 但最后一个 bin 是关闭的 [a, b]。对于这种情况,每个 bin 的宽度是相等的。

如果分配给 bin 的序列的每个元素之间的差异不相等,则每个 bin 的宽度不同,因此 bin 宽度取决于序列。

示例 1:相等的 bin 宽度

蟒蛇3

import matplotlib.pyplot as plt
  
marks = [1, 2, 3, 2, 1, 2, 3, 2, 
         1, 4, 5, 4, 3, 2, 5, 4, 
         5, 4, 5, 3, 2, 1, 5]
  
plt.hist(marks, bins=[1, 2, 3, 4, 5], edgecolor="black")
plt.show()

输出 :

示例 2:不等的 bin 宽度

蟒蛇3

import matplotlib.pyplot as plt
  
data = [189, 185, 195, 149, 189, 147,
        154, 174, 169, 195, 159, 192,
        155, 191, 153, 157, 140, 144, 
        172, 157, 181, 182, 166, 167]
  
plt.hist(data, bins=[140, 150, 160, 175, 185, 200],
         edgecolor="yellow", color="grey")
  
plt.show()

输出:

方法三:

为了在 bins 参数中传递一个序列,我们也可以使用 range函数来均匀分布的 bin。在 range() 中,起点是数据的最小值,终点是数据的最大值 + 提到的 bin 宽度,如 range() 中,不包括端点,步长是 bin 宽度。

由于 range() 中的步长是固定的,因此我们在直方图中获得了相同大小的 bin。

例子 :

蟒蛇3

import matplotlib.pyplot as plt
  
data = [87, 53, 66, 61, 67, 68, 62, 110,
        104, 61, 111, 123, 117, 119, 116,
        104, 92, 111, 90, 103, 81, 80, 101,
        51, 79, 107, 110, 129, 145, 128, 
        132, 135, 131, 126, 139, 110]
  
binwidth = 8
plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth),
         edgecolor="yellow", color="brown")
  
plt.show()

输出 :