Бар-чарт на 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.