Matplotlib 直方图中的 bin 大小
先决条件: Matplotlib
直方图是用户给出的数据分布的图形表示。它的外观类似于条形图,只是它是连续的。
直方图的塔或条称为箱。每个 bin 的高度显示该数据中有多少值落入该范围。
Width of each bin is = (max value of data – min value of data) / total number of bins
要在直方图中创建的 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()
输出 :