Matplotlib.pyplot.hist: примеры (PYTHON)
matplotlib.pyplot.hist(x: array-like, bins: int or sequence=10, range: tuple=None, density: bool=False, weights: array-like=None, cumulative: bool=False, bottom: array-like or scalar=0, histtype: str='bar', align: str='mid', orientation: str='vertical', rwidth: float=None, log:): tuple (n, bins, patches)Функция matplotlib.pyplot.hist в Python
Функция hist из библиотеки Matplotlib применяется для построения гистограмм распределения числовых данных. Гистограмма представляет собой столбчатую диаграмму, отображающую частоту встречаемости значений в определенных интервалах (бинах). Основное назначение функции - визуализация и анализ распределения данных.
Функция используется для задач статистического анализа, изучения формы распределения, выявления выбросов, оценки плотности вероятности.
Аргументы функции
- x: одномерный массив или последовательность чисел. Основные данные для построения.
- bins: определяет количество или границы бинов. Может быть целым числом (количество равных интервалов), последовательностью (границы интервалов) или строкой (алгоритм расчета, например
'auto','fd','sqrt'). - range: кортеж из двух чисел, задающий минимальное и максимальное значение для расчета бинов. Значения вне диапазона игнорируются.
- density: если
True, гистограмма нормализуется так, что площадь под ней равна 1. Представляет оценку плотности вероятности. - weights: массив весовых коэффициентов той же формы, что и
x. Каждое значение вxумножается на соответствующий вес. - cumulative: если
True, строится кумулятивная гистограмма (накопленная частота). - bottom: расположение нижней границы столбцов. Может быть числом или массивом той же длины, что и количество бинов.
- histtype: тип гистограммы:
'bar'(обычная),'barstacked'(столбцы сложены),'step'(ступенчатая),'stepfilled'(заполненная ступенчатая). - align: выравнивание столбцов относительно границ бинов:
'left','mid'(по умолчанию),'right'. - orientation: ориентация:
'vertical'или'horizontal'. - rwidth: относительная ширина столбцов относительно ширины бина.
- log: если
True, ось частот (или плотности) отображается в логарифмическом масштабе. - color: цвет столбцов.
- label: метка для легенды.
- stacked: при построении нескольких наборов данных
Trueобъединяет их в один столбец (накладывает).
Возвращаемые значения
- n: массив значений частот (или плотности, если
density=True) для каждого бина. - bins: массив границ бинов (длиной
len(n)+1). - patches: список объектов
Patch(столбцов), представляющих нарисованные элементы гистограммы.
Основные примеры использования функции hist
Простая гистограмма
import matplotlib.pyplot as plt
import numpy as np
# Генерация данных
data = np.random.randn(1000)
# Построение гистограммы
n, bins, patches = plt.hist(data, bins=30, alpha=0.7, color='blue')
plt.xlabel('Значения')
plt.ylabel('Частота')
plt.title('Простая гистограмма')
plt.show()Результат: отображается гистограмма с 30 столбцами синего цвета, показывающая нормальное распределение сгенерированных данных.
Гистограмма с оценкой плотности
# Гистограмма с нормализацией
n, bins, patches = plt.hist(data, bins=30, density=True,
alpha=0.6, color='green')
plt.xlabel('Значения')
plt.ylabel('Плотность вероятности')
plt.title('Нормализованная гистограмма')
plt.show()Результат: гистограмма, где площадь под кривой равна 1, что позволяет сравнивать с теоретической плотностью распределения.
Кумулятивная гистограмма
# Кумулятивное распределение
n, bins, patches = plt.hist(data, bins=30, cumulative=True,
histtype='step', linewidth=2,
color='red')
plt.xlabel('Значения')
plt.ylabel('Накопленная частота')
plt.title('Кумулятивная гистограмма')
plt.show()Результат: ступенчатая кривая, показывающая накопленную частоту от минимального к максимальному значению.
Горизонтальная гистограмма
# Горизонтальная ориентация
n, bins, patches = plt.hist(data, bins=30, orientation='horizontal',
alpha=0.5, color='purple')
plt.xlabel('Частота')
plt.ylabel('Значения')
plt.title('Горизонтальная гистограмма')
plt.show()Результат: гистограмма, где столбцы направлены горизонтально, а ось значений расположена по вертикали.
Несколько наборов данных
# Два набора данных
data1 = np.random.normal(0, 1, 500)
data2 = np.random.normal(3, 1.5, 500)
n, bins, patches = plt.hist([data1, data2], bins=30,
label=['Данные 1', 'Данные 2'],
alpha=0.7)
plt.legend()
plt.xlabel('Значения')
plt.ylabel('Частота')
plt.title('Гистограмма двух наборов данных')
plt.show()Результат: две гистограммы разных цветов, расположенные рядом для сравнения распределений.
Похожие функции в Python
numpy.histogram
Функция numpy.histogram вычисляет гистограмму набора данных, но не строит график. Возвращает только частоты и границы бинов. Используется, когда требуется только числовая статистика без визуализации.
import numpy as np
# Только вычисление гистограммы
hist, bin_edges = np.histogram(data, bins=10)
print('Частоты:', hist)
print('Границы бинов:', bin_edges)Частоты: [ 12 80 216 290 227 112 42 17 4 0] Границы бинов: [-3.5 -2.8 -2.1 -1.4 -0.7 0. 0.7 1.4 2.1 2.8 3.5]
seaborn.histplot
Библиотека Seaborn предлагает функцию histplot, которая расширяет возможности базовой гистограммы. Включает автоматическую настройку, оценку плотности ядра (KDE), больше вариантов оформления. Предпочтительнее для сложных статистических визуализаций.
import seaborn as sns # Расширенная гистограмма с оценкой плотности sns.histplot(data, bins=30, kde=True, color='green') plt.show()
Результат: гистограмма с плавной кривой оценки плотности, автоматически подобранными параметрами оформления.
pandas.DataFrame.hist
Метод hist объектов Pandas DataFrame и Series строит гистограммы для всех столбцов данных. Удобен для быстрого анализа табличных данных без необходимости явных циклов.
import pandas as pd
# Гистограммы для всех столбцов DataFrame
df = pd.DataFrame({'A': np.random.randn(1000),
'B': np.random.exponential(1, 1000)})
df.hist(bins=20, figsize=(10, 5))
plt.show()Результат: сетка гистограмм для каждого столбца DataFrame с отдельными подграфиками.
matplotlib.pyplot.hist2d
Функция hist2d создает двумерную гистограмму для визуализации совместного распределения двух переменных. Используется вместо hist при работе с двумерными данными.
# Двумерная гистограмма x = np.random.randn(1000) y = np.random.randn(1000) plt.hist2d(x, y, bins=30, cmap='Blues') plt.colorbar() plt.show()
Результат: тепловая карта, где интенсивность цвета показывает частоту попадания в двумерные бины.
Альтернативы в других языках программирования
JavaScript (Chart.js)
Библиотека Chart.js предлагает гистограммы через тип графика 'bar' с соответствующими настройками. Отличается интерактивностью и веб-ориентированностью.
<canvas id="myChart"></canvas>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
const ctx = document.getElementById('myChart').getContext('2d');
const data = [/* массив данных */];
// Определение бинов вручную
const bins = 10;
const min = Math.min(...data);
const max = Math.max(...data);
const binWidth = (max - min) / bins;
const frequencies = new Array(bins).fill(0);
data.forEach(value => {
const index = Math.floor((value - min) / binWidth);
if (index >= bins) index = bins - 1;
frequencies[index]++;
});
const chart = new Chart(ctx, {
type: 'bar',
data: {
labels: Array.from({length: bins}, (_, i) =>
(min + i*binWidth).toFixed(1)),
datasets: [{
label: 'Частота',
data: frequencies,
backgroundColor: 'rgba(75, 192, 192, 0.6)'
}]
},
options: { scales: { y: { beginAtZero: true } } }
});
</script>R (base)
Язык R имеет встроенную функцию hist() для построения гистограмм с богатыми статистическими возможностями.
# Пример на R
data <- rnorm(1000)
hist(data, breaks = 30, col = "lightblue",
main = "Гистограмма в R", xlab = "Значения")Java (Apache Commons Math)
Библиотека Apache Commons Math предоставляет классы для вычисления гистограмм без графического вывода.
import org.apache.commons.math3.stat.Frequency;
import org.apache.commons.math3.stat.descriptive.*;
// Создание гистограммы
HistogramDataset dataset = new HistogramDataset();
double[] values = /* массив данных */;
dataset.addSeries("Данные", values, 10);
// Для визуализации требуется интеграция с графической библиотекойSQL (аналитические функции)
SQL может вычислять распределение данных с помощью агрегатных функций и оконных функций, но визуализация требует внешних средств.
-- Создание бинов и подсчет частот в PostgreSQL
WITH bins AS (
SELECT width_bucket(value, min_val, max_val, num_bins) AS bin
FROM data,
(SELECT MIN(value) AS min_val,
MAX(value) AS max_val FROM data) AS stats
)
SELECT bin, COUNT(*) AS frequency
FROM bins
GROUP BY bin
ORDER BY bin;C# (MathNet.Numerics)
Библиотека MathNet.Numerics включает функциональность для гистограмм с возможностью интеграции с графическими библиотеками.
using MathNet.Numerics.Statistics;
// Вычисление гистограммы
double[] data = /* массив данных */;
var histogram = new Histogram(data, 10);
// Получение частот
for (int i = 0; i < histogram.BucketCount; i++)
{
Console.WriteLine($"Бин {i}: {histogram[i].Count}");
}Типичные ошибки при использовании функции hist
Передача многомерных данных
# Неправильно: двумерный массив import numpy as np import matplotlib.pyplot as plt data_2d = np.random.randn(100, 2) plt.hist(data_2d, bins=10) # Ошибка
ValueError: x must be 1D
Неправильные границы бинов
# Последовательность границ бинов с ошибкой bins = [0, 10, 20, 15, 30] # Не отсортирована plt.hist([5, 15, 25], bins=bins)
ValueError: bins must increase monotonically
Конфликт параметров
# Одновременное использование density и weights без учета нормализации
data = np.random.randn(100)
weights = np.ones(100)
# Неявное поведение: weights также нормализуются
n, bins, patches = plt.hist(data, weights=weights,
density=True)
print("Сумма n * ширина_бина:", np.sum(n * np.diff(bins)))Сумма n * ширина_бина: 1.0 (веса были перенормированы)
Неправильный тип данных
# Строковые данные без преобразования data_str = ['1.5', '2.3', '3.1'] plt.hist(data_str, bins=5) # Ошибка
TypeError: '>' not supported between instances of 'str' and 'float'
Игнорирование возвращаемых значений при наложении графиков
# Наложение гистограмм без очистки области графика plt.hist(np.random.randn(100), bins=10, alpha=0.5) plt.hist(np.random.randn(100) + 2, bins=10, alpha=0.5) # Второй вызов добавляется к первому, что может быть ожидаемо, # но иногда требуется отдельный subplot
Изменения в последних версиях Matplotlib
Matplotlib 3.4.0 (2021)
Добавлен параметр histplot в pyplot.hist для более удобной интеграции с Seaborn-подобным синтаксисом (фактически, улучшена совместимость).
Matplotlib 3.5.0 (2021)
Улучшена обработка параметра bins для строковых значений, добавлены новые алгоритмы автоматического определения бинов.
Matplotlib 3.6.0 (2022)
Оптимизирована производительность для больших наборов данных, улучшена стабильность работы с параметром density при использовании weights.
Matplotlib 3.8.0 (2023)
Добавлена поддержка пропусков (NaN) в данных - они автоматически исключаются из расчета гистограммы без выдачи ошибок.
# NaN значения обрабатываются автоматически в версиях >= 3.8
import numpy as np
import matplotlib.pyplot as plt
data_with_nan = np.array([1.0, 2.0, np.nan, 3.0, 4.0, np.nan, 5.0])
n, bins, patches = plt.hist(data_with_nan, bins=5)
print("Частоты:", n)Частоты: [1. 1. 0. 1. 1.] (NaN значения игнорируются)
Расширенные примеры использования функции hist
Гистограмма с наложением теоретической плотности
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# Генерация данных из нормального распределения
data = np.random.normal(0, 1, 1000)
# Построение гистограммы с оценкой плотности
n, bins, patches = plt.hist(data, bins=30, density=True,
alpha=0.6, color='g',
label='Эмпирическая плотность')
# Добавление теоретической кривой
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = norm.pdf(x, 0, 1)
plt.plot(x, p, 'k', linewidth=2, label='Теоретическая N(0,1)')
plt.legend()
plt.title('Сравнение с теоретическим распределением')
plt.show()Гистограмма с весами и пользовательскими бинами
# Данные с весами, отражающими важность наблюдений
values = np.random.uniform(0, 10, 500)
weights = np.random.exponential(1, 500) # Веса из экспоненциального распределения
# Пользовательские бины (неравномерные)
custom_bins = [0, 2, 3, 5, 7, 10]
n, bins, patches = plt.hist(values, bins=custom_bins,
weights=weights,
edgecolor='black',
alpha=0.7)
plt.xlabel('Значения')
plt.ylabel('Взвешенная частота')
plt.title('Гистограмма с весами и пользовательскими бинами')
plt.show()Стек гистограмм для категориальных данных
# Разные категории данных
np.random.seed(42)
cat1 = np.random.normal(5, 1.5, 300)
cat2 = np.random.normal(7, 1, 300)
cat3 = np.random.normal(9, 0.8, 300)
n, bins, patches = plt.hist([cat1, cat2, cat3], bins=20,
stacked=True,
label=['Категория 1', 'Категория 2', 'Категория 3'],
color=['skyblue', 'lightgreen', 'salmon'])
plt.legend()
plt.xlabel('Значения')
plt.ylabel('Накопленная частота')
plt.title('Сложенные гистограммы по категориям')
plt.show()Логарифмическая шкала по обеим осям
# Данные с тяжелым хвостом распределения
data = np.random.pareto(2, 1000) + 1
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
# Обычная гистограмма
ax1.hist(data, bins=30, alpha=0.7)
ax1.set_title('Линейная шкала')
ax1.set_xlabel('Значения')
ax1.set_ylabel('Частота')
# Логарифмическая шкала по осям
ax2.hist(data, bins=np.logspace(0, 2, 30),
alpha=0.7, color='red')
ax2.set_xscale('log')
ax2.set_yscale('log')
ax2.set_title('Логарифмическая шкала')
ax2.set_xlabel('Значения (log scale)')
ax2.set_ylabel('Частота (log scale)')
plt.tight_layout()
plt.show()Анимированная гистограмма
import matplotlib.animation as animation
from IPython.display import HTML
fig, ax = plt.subplots()
# Начальные данные
data = np.random.randn(1000)
n, bins, patches = ax.hist(data, bins=30, alpha=0.7)
ax.set_ylim(0, 150)
# Функция обновления для анимации
def update(frame):
ax.clear()
# Добавляем новые данные каждый кадр
new_data = np.concatenate([data[10:], np.random.randn(10)])
n, bins, patches = ax.hist(new_data, bins=30, alpha=0.7, color='blue')
ax.set_ylim(0, 150)
ax.set_title(f'Кадр {frame}: Гистограмма обновляемых данных')
return patches,
ani = animation.FuncAnimation(fig, update, frames=50,
interval=200, blit=False)
plt.close()
# Для отображения в Jupyter
# HTML(ani.to_jshtml())питон matplotlib.pyplot.hist function comments
- питон matplotlib.pyplot.hist - аргументы и возвращаемое значение
- Функция python matplotlib.pyplot.hist - описание
- matplotlib.pyplot.hist - примеры
- matplotlib.pyplot.hist - похожие методы на python
- matplotlib.pyplot.hist на php, c#, sql, java
- matplotlib.pyplot.hist изменения python
- Примеры matplotlib.pyplot.hist на питон