Canfly Avrora
26 сентября 2025, 14:49

Бар-чарт на Python

Создано с помощью Canfly Avrora
26 сентября 2025

Бар-чарт (столбчатая диаграмма) на Python

Бар-чарт — это график для сравнения категорий по числовому показателю. В Python чаще всего используют Matplotlib, Seaborn, Pandas и Plotly.

Ниже — самые полезные рецепты с краткими примерами.

Установка и импорт

# pip install matplotlib seaborn pandas plotly
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

Пример данных

df = pd.DataFrame({
    'Категория': ['A', 'B', 'C', 'D'],
    'Значение': [23, 45, 12, 36]
})

Базовый бар-чарт (Matplotlib)

fig, ax = plt.subplots(figsize=(6, 4))
ax.bar(df['Категория'], df['Значение'], color='#4C78A8')
ax.set(title='Значения по категориям', xlabel='Категория', ylabel='Значение')

# Подписи над столбцами (Matplotlib >=3.4: ax.bar_label)
for i, v in enumerate(df['Значение']):
    ax.text(i, v, str(v), ha='center', va='bottom')

plt.tight_layout()
plt.show()

Через Pandas (самый быстрый путь)

df.set_index('Категория')['Значение'].plot(kind='bar', color='C0', figsize=(6, 4))
plt.ylabel('Значение')
plt.title('Значения по категориям')
plt.tight_layout()
plt.show()

Seaborn (средние/ДИ «из коробки»)

sns.set_theme(style='whitegrid')
sns.barplot(data=df, x='Категория', y='Значение', color='C0')
plt.title('Значения по категориям')
plt.show()
  • По умолчанию Seaborn показывает доверительные интервалы для усреднённых данных (можно отключить
    errorbar=None
    ).

Горизонтальная диаграмма

Горизонтальная диаграмма удобна для длинных подписей и сортировки.

fig, ax = plt.subplots(figsize=(6, 4))
ordered = df.sort_values('Значение')
ax.barh(ordered['Категория'], ordered['Значение'], color='C0')
ax.set(xlabel='Значение', ylabel='Категория', title='Горизонтальный бар-чарт')
plt.tight_layout()
plt.show()

Группированные столбцы (несколько серий)

df_g = pd.DataFrame({
    'Категория': ['A','B','C','D']*2,
    'Год': [2023]*4 + [2024]*4,
    'Значение': [20, 30, 10, 40, 25, 35, 12, 45]
})

sns.barplot(data=df_g, x='Категория', y='Значение', hue='Год', palette='Set2')
plt.title('Группированный бар-чарт')
plt.show()

Сложенные (stacked) и 100% stacked

pivot = df_g.pivot(index='Категория', columns='Год', values='Значение')
# Сложенные
pivot.plot(kind='bar', stacked=True, figsize=(6,4), colormap='tab20')
plt.title('Stacked')
plt.tight_layout(); plt.show()

# 100% stacked (нормировка по строке)
pct = pivot.div(pivot.sum(axis=1), axis=0)
pct.plot(kind='bar', stacked=True, figsize=(6,4), colormap='tab20')
plt.title('100% Stacked'); plt.gca().yaxis.set_major_formatter(lambda x, p: f'{x:.0%}')
plt.tight_layout(); plt.show()

Ошибки/доверительные интервалы

  • Matplotlib:
    yerr
    и
    capsize
    .
  • Seaborn:
    errorbar=('ci', 95)
    или
    errorbar='sd'
    .
means = df['Значение']
stderr = np.array([2, 4, 1, 3])

fig, ax = plt.subplots()
ax.bar(df['Категория'], means, yerr=stderr, capsize=4, color='C0')
ax.set_title('Со столбиками ошибок')
plt.show()

Сортировка, цвета, аннотации

ordered = df.sort_values('Значение', ascending=False)
fig, ax = plt.subplots()
bars = ax.bar(ordered['Категория'], ordered['Значение'], color=sns.color_palette('Blues', len(ordered)))
ax.set_title('Сортировка и палитра')
ax.margins(y=0.1)

# Подписи поверх (Matplotlib >=3.4)
ax.bar_label(bars, padding=3)
plt.show()

Работа с подписями (длинный текст, форматирование чисел)

import textwrap
labels = ['Очень длинная категория 1', 'Очень длинная категория 2', 'Краткая', 'Средняя']
vals = [12000, 5300, 9800, 15000]
fig, ax = plt.subplots(figsize=(7,4))
ax.bar(range(len(vals)), vals, color='C0')
wrapped = ['\n'.join(textwrap.wrap(l, width=14)) for l in labels]
ax.set_xticks(range(len(vals)), wrapped, rotation=0)

from matplotlib.ticker import StrMethodFormatter
ax.yaxis.set_major_formatter(StrMethodFormatter('{x:,.0f}'))  # 12,000 формат
plt.tight_layout(); plt.show()

Примечание: для русских разделителей пробелом можно использовать FuncFormatter и заменить запятые на пробелы.

Поддержка кириллицы

Современный Matplotlib по умолчанию использует DejaVu Sans (поддерживает кириллицу). Если в окружении нет шрифта:

plt.rcParams['font.family'] = 'DejaVu Sans'  # или другой установленный шрифт с кириллицей

Негативные значения, нулевая линия, лог-масштаб

vals = [10, -5, 7, -3]
cats = ['A','B','C','D']
fig, ax = plt.subplots()
ax.bar(cats, vals, color=['#4C78A8' if v>=0 else '#E45756' for v in vals])
ax.axhline(0, color='black', lw=1)  # базовая линия
plt.show()

Логарифмическая шкала для столбцов обычно не рекомендуется (база не может быть 0). Рассмотрите точечные/линейные графики.

Интерактивный бар-чарт (Plotly)

import plotly.express as px

fig = px.bar(df, x='Категория', y='Значение', text='Значение',
             title='Интерактивный бар-чарт')
fig.update_traces(textposition='outside', marker_color='#4C78A8')
fig.update_layout(yaxis_title='Значение', xaxis_title='Категория')
fig.show()
  • Наведение курсора, зум, экспорт из тулбара.
  • Для группированных:
    px.bar(..., color='Год', barmode='group')
    .
  • Для сложенных:
    barmode='relative'
    .

Сохранение графика

fig, ax = plt.subplots()
ax.bar(df['Категория'], df['Значение'])
plt.tight_layout()
plt.savefig('bar_chart.png', dpi=300, bbox_inches='tight')

Лучшие практики

  • Сортируйте категории по значению.
  • При длинных названиях — горизонтальный бар-чарт или перенос строк.
  • Не показывайте слишком много категорий; выбирайте Top-N.
  • Начинайте ось с нуля для честного сравнения высоты.
  • Добавляйте значения на столбцы, если категорий немного.
  • Используйте цвет для акцента, а не «радугу».
  • Для сравнения долей — stacked/100% stacked; для точной величины — группированный.

Частые ошибки

  • Слишком плотные подписи (решается поворотом, переносом, горизонтальным видом).
  • Отсутствие нулевой линии при положительных числах.
  • Смешение масштабов (разные оси без явной легенды).
  • Лог-ось на бар-чарте — может вводить в заблуждение.

Маленькие рецепты

  • Разнести подграфики:
fig, axes = plt.subplots(1, 2, figsize=(10,4), sharey=True)
sns.barplot(data=df, x='Категория', y='Значение', ax=axes[0])
sns.barplot(data=df_g, x='Категория', y='Значение', hue='Год', ax=axes[1])
plt.tight_layout(); plt.show()
  • Выделить один столбец:
highlight = 'C'
colors = ['#E45756' if c==highlight else '#C0C0C0' for c in df['Категория']]
plt.bar(df['Категория'], df['Значение'], color=colors)
plt.title(f'Фокус на {highlight}')
plt.show()

Эти примеры покрывают 90% задач по построению столбчатых диаграмм в Python. Выбор инструмента:

  • Быстро и статично: Pandas/Matplotlib.
  • Красиво с агрегированием: Seaborn.
  • Интерактивно и для веба: Plotly.
Бар-чарт на Python | Canfly Avrora