Функция bar() / barh() в Matplotlib


Matplotlib 参考文档Справочная документация Matplotlib

bar()Используется для построения вертикальных столбчатых диаграмм,barh()Используется для построения горизонтальных столбчатых диаграмм.

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

Определение функции

bar() - Вертикальная столбчатая диаграмма

matplotlib.pyplot.bar(x, height, width=0.8, bottom=0, *, align='center',
    **kwargs)

barh() - Горизонтальная столбчатая диаграмма

matplotlib.pyplot.barh(y, width, height=0.8, left=0, *, align='center',
    **kwargs)

Интерфейс Axes

Axes.bar(x, height, width=0.8, bottom=0, *, align='center', **kwargs)
Axes.barh(y, width, height=0.8, left=0, *, align='center', **kwargs)

Описание параметра

ПараметрTypeОписание
x / yмассивоподобныйКоординаты положения столбцов (x для вертикальных, y для горизонтальных)
height / widthмассивоподобныйВысота (вертикальная) или ширина (горизонтальная) столбцов, т. е. значения данных
width(bar)/ height(barh)float или array-likeШирина/высота столбцов, по умолчанию 0.8
bottom / leftfloat или array-likeНачальная позиция нижней части столбцов, по умолчанию 0. Может использоваться для построения диаграмм с накоплением (stacked bar charts).
alignstrВыравнивание столбцов относительно координат x/y: 'center' (по умолчанию) или 'edge'
colorcolor или listЦвет столбцов, может быть одним цветом или списком цветов
edgecolorcolorЦвет границы столбцов
linewidth / lwfloatШирина границы столбца
tick_labelмассивоподобныйПодписи делений для столбцов, соответствующие взаимно однозначно позициям по x
labelstrПодпись легенды (используется для группированных столбчатых диаграмм)
альфаfloatПрозрачность
hatchstrШаблоны заливки: '/', '\\', '|', '-', '+', 'x', 'o', '*'

Дополнительные примечания к bar_label()

bar_label()Используется для отображения подписей значений непосредственно на столбцах.

Axes.bar_label(container, labels=None, *, fmt=None, label_type='edge',
    padding=0, **kwargs)

Оба метода bar() и barh() возвращаютBarContainerобъект, который можно передать в bar_label() для добавления подписей значений. Это рекомендуемый подход в Matplotlib 3.4+.


Примеры использования

Пример 1: Базовая вертикальная столбчатая диаграмма

Пример

import matplotlib.pyplot as plt

# Метки категорий и данные
categories = ['Python', 'Java', 'JavaScript', 'C++', 'Go']
values = [85, 72, 68, 55, 42]

fig, ax = plt.subplots(layout='constrained')

# Нарисовать столбчатую диаграмму
bars = ax.bar(categories, values,
              color=['#3498db', '#e74c3c', '#f39c12', '#2E7DCC', '#9b59b6'],
              edgecolor='white', linewidth=1)

# Отобразить значения на столбцах
ax.bar_label(bars, fmt='%d', padding=3)

ax.set_title('Популярность языков программирования')
ax.set_ylabel('Баллы')
ax.set_ylim(0, 100)
ax.grid(axis='y', alpha=0.3)
plt.show()

Пример 2: Сгруппированная столбчатая диаграмма

Пример

import matplotlib.pyplot as plt
import numpy as np

# Сгруппированные данные
labels = ['Q1', 'Q2', 'Q3', 'Q4']
product_a = [120, 135, 148, 162]
product_b = [90, 105, 115, 130]

x = np.arange(len(labels))   # позиции x: [0, 1, 2, 3]
width = 0.35                  # Ширина каждого столбца

fig, ax = plt.subplots(layout='constrained')

# Первая группа столбцов (смещение -width/2)
bars1 = ax.bar(x - width/2, product_a, width,
               label='Продукт A', color='steelblue', edgecolor='white')
# Вторая группа столбцов (смещение +width/2)
bars2 = ax.bar(x + width/2, product_b, width,
               label='Продукт B', color='coral', edgecolor='white')

# Добавить подписи значений
ax.bar_label(bars1, padding=3, fmt='%d')
ax.bar_label(bars2, padding=3, fmt='%d')

ax.set_title('Сравнение квартальных продаж')
ax.set_ylabel('Продажи (единицы)')
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()
ax.grid(axis='y', alpha=0.3)
plt.show()

Пример 3: Столбчатая диаграмма с накоплением

Пример

import matplotlib.pyplot as plt

categories = ['Янв', 'Фев', 'Мар', 'Апр', 'Май']
income = [5000, 5200, 4800, 5500, 6000]
expense = [3000, 3500, 3200, 4000, 4200]

fig, ax = plt.subplots(layout='constrained')

# Первый слой столбцов (нижний)
bars_income = ax.bar(categories, income,
                     label='Доход', color='#2E7DCC', edgecolor='white')
# Второй слой столбцов (наложен поверх первого слоя)
bars_expense = ax.bar(categories, expense, bottom=income,
                      label='Расход', color='#e74c3c', edgecolor='white')

# Добавить подписи
ax.bar_label(bars_income, label_type='center', fmt='$%d')
ax.bar_label(bars_expense, label_type='center', fmt='$%d')

ax.set_title('Столбчатая диаграмма с накоплением: ежемесячные финансы')
ax.set_ylabel('Сумма ($)')
ax.legend()
ax.grid(axis='y', alpha=0.3)
plt.show()

Пример 4: Горизонтальная столбчатая диаграмма (barh)

Пример

import matplotlib.pyplot as plt

tasks = ['Задача A', 'Задача B', 'Задача C', 'Задача D', 'Задача E']
hours = [12.5, 8.0, 15.3, 6.2, 10.8]

fig, ax = plt.subplots(figsize=(8, 4), layout='constrained')

# Горизонтальная столбчатая диаграмма
bars = ax.barh(tasks, hours,
               color='#3498db', edgecolor='white', height=0.6)

# Добавить подписи в конце столбцов
ax.bar_label(bars, fmt='%.1f h', padding=5)

ax.set_title('Время выполнения задачи (горизонтальная столбчатая диаграмма)')
ax.set_xlabel('Часы')
ax.invert_yaxis()  # Инвертировать ось y, чтобы первая категория была сверху
ax.grid(axis='x', alpha=0.3)
plt.show()

ЧАВО

Каково соответствие осей для bar() и barh()?

bar(x, height): x — это позиция, height определяет высоту столбца (вертикальное направление).

barh(y, width): y — это позиция, width определяет ширину столбца (горизонтальное направление).

Обратите внимание на разные имена параметров: bar использует height, barh использует width для представления значений данных.

Как расположить столбцы на групповой столбчатой диаграмме рядом друг с другом?

будетwidthУстановите его равным обратной величине общей ширины каждой группы столбцов, и используйтеalign='edge'。


Matplotlib 参考文档Справочная документация Matplotlib

Другие расширения