Почему нормализация plt.hist () не работает должным образом? - PullRequest
0 голосов
/ 09 апреля 2020

Я написал этот код:

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])

plt.hist(X, bins, density=True)
plt.plot([0, 1, 2], [0.3, 0.5, 1/6], 'ro')
plt.grid()
plt.show()

и получил следующие результаты:

graph of histogram

Почему результат нормализуется при установке density=True?

1 Ответ

0 голосов
/ 10 апреля 2020

Неясно, что содержит переменная 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

Обратите внимание, что нормализованная гистограмма не означает, что столбцы должны быть равны единице. Нормализация означает, что общая площадь всех баров должна быть одна. Площадь бара равна его ширине, умноженной на его высоту. Например, в случае, если имеется 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...