Гистограммы в Matplotlib

Обновлено: 12.12.2025

Гистограмма — это график, отображающий распределение частот, то есть такой, который показывает количество случаев (наблюдений) в каждом заданном интервале.

В библиотеке Matplotlib для создания гистограмм предназначена функция hist модуля pyplot, которая принимает один массив. Встречающиеся в нем варианты значений или их диапазоны будут представлены на оси x. По оси y будет показано количество таких значений в массиве или попавших в каждый диапазон.

import numpy as np
import matplotlib.pyplot as plt

fig, axs = plt.subplots(2,2, layout='constrained')

a = np.random.choice(['a', 'b', 'c', 'd', 'e'], size=100,
                     p=[0.1, 0.4, 0.1, 0.2, 0.2])
axs[0,0].hist(a)

b = np.random.randint(10, 20, size=1000)
axs[0,1].hist(b, edgecolor='black', color='lightgreen')

c = np.random.binomial(n=10, p=0.5, size=8)
axs[1,0].set_title(f'{c}')
axs[1,0].hist(c, color='darkorange')

d = np.random.normal(size=1000)
axs[1,1].hist(d, color='c', edgecolor='m', linewidth=0.3)

plt.show()
Разные гистограммы, полученные с помощью функции hist библиотеки Matplotlib

По умолчанию количество столбцов гистограммы 10 (может быть меньше, если в массиве меньше десяти элементов). Если требуется получить более детализированный график или задать свои диапазоны, делается это с помощью параметра bins.

a = np.random.normal(size=1000)

fig, axs = plt.subplot_mosaic([['l', 'r'], ['b', 'b']],
                              layout='constrained')

axs['l'].hist(a, bins=20, color='c', edgecolor='m', linewidth=0.3)

axs['r'].hist(a, edgecolor='black', linewidth=0.3,
              bins=[-4, -2, -1, 0, 1, 2, 3, 4])
axs['r'].set_xticks(np.arange(-4, 5))

axs['b'].hist(a, edgecolor='black', color='pink', linewidth=0.3,
              bins=np.arange(-1, 1.1, 0.25))
axs['b'].set_xticks(np.arange(-1, 1.1, 0.25))
Гистограммы с заданным параметром bins

Диапазоны для bins не обязательно должны быть одинаковой ширины. В одной "корзине" можно накапливать значения с большим разбросом, чем в другой.

plt.hist(a, bins=[-4, -2, -1, 0, 1, 2, 4], rwidth=0.9)
Параметр bins с разными по ширине диапазонами

Параметр rwidth задает относительную ширину баров как часть от их исходной ширины.

Задать каждому бину свой цвет через параметры hist() не получится. Для этого надо получить доступ к самим "артистам" — бинам-прямоугольникам. Функция hist() возвращает количество столбцов (массив ndarray), координаты начала каждого по оси x (ndarray), итерируемый объект-коллекцию графического представления бинов.

a = np.random.choice(['a', 'b', 'c', 'd', 'e'], size=100,
                     p=[0.1, 0.4, 0.1, 0.2, 0.2])
heights, start_points, rectangles = plt.hist(a)

colors = ['red', 'orange', 'green', 'blue', 'violet']
for i, patch in enumerate(rectangles):
    if patch.get_height() > 0:
        patch.set_facecolor(colors.pop(0))
Разноцветные столбцы гистограммы в Matplotlib

В примере выше мы вынуждены проверять высоту прямоугольника на неравенство нулю, так как по умолчанию генерируется 10 бинов (на гистограмме пропуски — это столбцы с нулевой высотой). Иначе надо задавать значение для параметра bins. В этом случае бины будут прилегать друг к другу.

Пример использования цветовой карты:

from matplotlib import colors

a = np.random.normal(size=1000, scale=10, loc=170)
n, start_points, patches = plt.hist(a, bins=20)

fracs = n / n.max()
norm = colors.Normalize(fracs.min(), fracs.max())

for f, p in zip(fracs, patches):
    color = plt.cm.cool_r(norm(f))
    p.set_facecolor(color)
Применение цветовой карты к гистограмме