Для дискретных данных гистограмма используется немного иначе, чем для непрерывных, потому что значения принимаются отдельными уровнями, а не на непрерывном интервале.

Ключевая идея:
один столбец ↔ одно дискретное значение (или узкий интервал вокруг него).

Пример дискретных данных:

import numpy as np
 
data = np.random.poisson(lam=3, size=1000)

Если построить гистограмму «по умолчанию», бины могут выглядеть смазанно. Поэтому бины обычно задают явно.

Правильная настройка бинов:

import matplotlib.pyplot as plt
 
bins = np.arange(data.min(), data.max() + 2) - 0.5
plt.hist(data, bins=bins, density=True)
plt.show()

Что здесь происходит:

– бины центрируются на целых значениях
– каждое целое число получает свой столбец
– гистограмма отражает эмпирическое дискретное распределение

Почему важно смещать бины на 0.5:

Без смещения значения «попадают на границы» интервалов, и столбцы перестают соответствовать конкретным значениям.

Интерпретация:

– высота столбца ≈ вероятность P(X = k)
– сумма площадей столбцов = 1 (при density=True)
– форма отражает эмпирическое распределение Пуассона, биномиального и т.п.

Альтернатива без plt.hist:

Для дискретных данных часто удобнее считать частоты напрямую:

values, counts = np.unique(data, return_counts=True)
probs = counts / counts.sum()
 
plt.bar(values, probs)
plt.show()

Когда что использовать:

plt.hist с явными бинами → когда хочется унифицированный подход
plt.bar → когда значения дискретные и их немного

Коротко:
гистограмма для дискретных данных строится с бинами, выровненными по целым значениям, чтобы каждый столбец соответствовал конкретному значению случайной величины.