Неясно, что содержит переменная bins
в вопросе.
При наличии только трех значений на оси x логические границы бина будут -0,5, 0,5, 1,5 и 2,5. В этом случае гистограмма была бы хорошо нормализована, так что высота будет равна единице (0.3 + 8/15 + 1/6 = 1
).
import matplotlib.pyplot as plt
import numpy as np
num_of_points = 10000
Xvec = np.random.uniform(0, 1, num_of_points)
X1 = np.sum(Xvec < 0.3)
X2 = np.sum(np.logical_and(Xvec >= 0.3, Xvec < 5/6))
X3 = np.sum(Xvec >= 5/6)
X = np.hstack([np.zeros(X1), np.ones(X2), np.ones(X3)*2])
bins=[-0.5,0.5,1.5,2.5]
plt.hist(X, bins, density=True)
plt.plot([0, 1, 2], [0.3, 0.5, 1/6], 'ro')
plt.grid()
plt.show()
![resulting plot](https://i.stack.imgur.com/3YkzQ.png)
Обратите внимание, что нормализованная гистограмма не означает, что столбцы должны быть равны единице. Нормализация означает, что общая площадь всех баров должна быть одна. Площадь бара равна его ширине, умноженной на его высоту. Например, в случае, если имеется 10 равномерно расположенных лотков, а x-es go от 0
до 2
, все лотки будут иметь ширину 0.2
. Этот автоматический интервал c не очень логичен go вместе с x-es, которые ограничены целыми числами, но работают как задумано. Границы бина и значения возвращаются plt.hist
и могут быть проверены:
values, binbounds, patches = plt.hist(X, 10, density=True)
print(values) # [1.486 0. 0. 0. 0. 2.662 0. 0. 0. 0.852]
print(binbounds) # [0. 0.2 0.4 0.6 0.8 1. 1.2 1.4 1.6 1.8 2. ]
Сумма значений 1.486 + 2.662 + 0.852 = 5.0
. Умножение на ширину каждой ячейки (0.2
) дает желаемую область 1.0
.
Значения ячейки составляют 1.0
, когда все ширины ячейки будут 1
.