Гистограммы в 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()
По умолчанию количество столбцов гистограммы 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 не обязательно должны быть одинаковой ширины. В одной "корзине" можно накапливать значения с большим разбросом, чем в другой.
plt.hist(a, bins=[-4, -2, -1, 0, 1, 2, 4], rwidth=0.9)
Параметр 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))
В примере выше мы вынуждены проверять высоту прямоугольника на неравенство нулю, так как по умолчанию генерируется 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)