Столбчатая диаграмма Python Matplotlib: создание красивых графиков
Пройдите тест, узнайте какой профессии подходите
Для кого эта статья:
- Разработчики и аналитики данных, желающие улучшить свои навыки визуализации
- Студенты и начинающие специалисты в области программирования на Python
Профессионалы из области бизнеса и науки, которым нужно представлять данные в наглядном виде
Столбчатые диаграммы — мощный инструмент визуализации, позволяющий мгновенно считывать сравнительные данные и выявлять ключевые тренды. Python с библиотекой Matplotlib даёт разработчикам безграничные возможности для создания не просто информативных, но и эстетически привлекательных графиков. Будь то анализ продаж, научное исследование или презентация для руководства — умение создавать профессиональные столбчатые диаграммы выделит вас среди других специалистов и сделает ваши данные понятными даже неподготовленной аудитории. 📊
Хотите освоить не только визуализацию данных, но и весь спектр возможностей Python? Курс «Python-разработчик» с нуля от Skypro — это ваш путь к профессиональному владению инструментами визуализации данных. На курсе вы освоите не только Matplotlib для создания впечатляющих диаграмм, но и другие библиотеки для анализа данных, что сделает вас востребованным специалистом на рынке труда.
Основы создания столбчатых диаграмм в Matplotlib
Столбчатая диаграмма (bar chart) — один из самых популярных и интуитивно понятных способов визуализации категориальных данных. Matplotlib предоставляет простой и гибкий интерфейс для их создания. Начнем с базового примера. 🚀
Для создания простейшей столбчатой диаграммы требуется всего несколько строк кода:
import matplotlib.pyplot as plt
import numpy as np
# Данные для диаграммы
categories = ['A', 'B', 'C', 'D', 'E']
values = [25, 40, 30, 55, 15]
# Создание диаграммы
plt.figure(figsize=(10, 6))
plt.bar(categories, values)
plt.title('Простая столбчатая диаграмма')
plt.xlabel('Категории')
plt.ylabel('Значения')
plt.show()
Этот код создаст базовую столбчатую диаграмму, но её потенциал гораздо шире. Разберём ключевые компоненты функции bar()
:
- x — позиции категорий на оси X
- height — значения высоты столбцов
- width — ширина столбцов (по умолчанию 0.8)
- color — цвет столбцов
- align — выравнивание столбцов ('center' или 'edge')
При работе с реальными данными часто требуется визуализировать несколько групп значений. Для этого можно использовать сгруппированные столбчатые диаграммы:
# Данные для нескольких групп
categories = ['Кат. 1', 'Кат. 2', 'Кат. 3', 'Кат. 4']
group1 = [10, 23, 15, 18]
group2 = [12, 19, 22, 8]
# Создание позиций для х
x = np.arange(len(categories))
width = 0.35
fig, ax = plt.subplots(figsize=(12, 7))
bar1 = ax.bar(x – width/2, group1, width, label='Группа 1')
bar2 = ax.bar(x + width/2, group2, width, label='Группа 2')
ax.set_xlabel('Категории')
ax.set_ylabel('Значения')
ax.set_title('Сгруппированная столбчатая диаграмма')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()
plt.show()
Тип диаграммы | Функция Matplotlib | Типичное применение |
---|---|---|
Вертикальная столбчатая | bar() | Сравнение категорий |
Горизонтальная столбчатая | barh() | Длинные названия категорий |
Сгруппированная | bar() с настройкой позиций | Сравнение нескольких групп |
Накопительная | bar() с параметром bottom | Отображение составляющих целого |
Для создания горизонтальной столбчатой диаграммы используйте функцию barh()
, которая особенно полезна когда названия ваших категорий длинные:
plt.figure(figsize=(10, 8))
plt.barh(categories, values)
plt.title('Горизонтальная столбчатая диаграмма')
plt.xlabel('Значения')
plt.ylabel('Категории')
plt.show()
Для отображения составных частей целого удобно использовать накопительные (stacked) столбчатые диаграммы:
fig, ax = plt.subplots(figsize=(10, 6))
ax.bar(categories, group1, label='Группа 1')
ax.bar(categories, group2, bottom=group1, label='Группа 2')
ax.set_title('Накопительная столбчатая диаграмма')
ax.legend()
plt.show()

Настройка внешнего вида столбцов в диаграммах Python
Привлекательность визуализации напрямую влияет на восприятие данных. Matplotlib предлагает обширный инструментарий для настройки внешнего вида столбцов, что помогает не только сделать диаграммы эстетически приятными, но и более информативными. 🎨
Алексей Петров, старший аналитик данных Однажды мне поручили подготовить отчёт для совета директоров. Первую версию с базовыми столбчатыми диаграммами руководитель отправил на доработку: «Это выглядит как курсовая первокурсника». Я потратил вечер на изучение возможностей кастомизации в Matplotlib — и следующая презентация вызвала восторг. Добавив градиентную заливку столбцов, настроив прозрачность и текстуры, добавив аннотации и усовершенствовав сетку, я превратил скучные графики в информационно-насыщенный визуальный нарратив. Один из директоров даже спросил, какой сторонний сервис я использовал для создания таких диаграмм. Когда я ответил, что это чистый Python с Matplotlib, на следующей неделе меня попросили провести мини-семинар для аналитического отдела.
Начнём с базовых параметров настройки, которые моментально преобразят ваши диаграммы:
plt.figure(figsize=(12, 7))
bars = plt.bar(
categories,
values,
color='#5DA5DA', # Цвет столбцов
edgecolor='#2C3E50', # Цвет границ
linewidth=1.5, # Толщина границ
alpha=0.8, # Прозрачность
width=0.6, # Ширина столбцов
align='center' # Выравнивание
)
plt.title('Кастомизированная столбчатая диаграмма', fontsize=16)
plt.show()
Для более глубокой кастомизации можно использовать различные цвета для разных столбцов в зависимости от их значений или категорий:
colors = ['#5DA5DA', '#FAA43A', '#60BD68', '#F17CB0', '#B2912F']
plt.figure(figsize=(12, 7))
bars = plt.bar(categories, values, color=colors)
plt.title('Диаграмма с индивидуальными цветами столбцов')
plt.show()
Добавление значений над столбцами значительно улучшает интерпретацию данных:
plt.figure(figsize=(12, 7))
bars = plt.bar(categories, values, color='#5DA5DA')
# Добавление подписей над каждым столбцом
for bar in bars:
height = bar.get_height()
plt.text(
bar.get_x() + bar.get_width() / 2,
height + 1,
f'{height}',
ha='center',
va='bottom',
fontsize=10
)
plt.title('Столбчатая диаграмма со значениями')
plt.show()
Использование различных стилей и тем позволяет быстро изменить общий внешний вид диаграммы:
plt.style.use('ggplot') # Популярные стили: 'seaborn', 'dark_background', 'bmh'
plt.figure(figsize=(12, 7))
plt.bar(categories, values)
plt.title('Диаграмма с использованием стиля ggplot')
plt.show()
Для продвинутой визуализации можно использовать градиентную заливку столбцов:
import matplotlib.cm as cm
fig, ax = plt.subplots(figsize=(12, 7))
gradient = np.linspace(0, 1, len(categories))
colors = cm.viridis(gradient)
bars = ax.bar(categories, values, color=colors)
ax.set_title('Столбчатая диаграмма с градиентной заливкой')
plt.show()
Существует множество вариантов настройки внешнего вида, которые можно комбинировать в зависимости от ваших задач:
- Штриховка (hatch) — добавляет текстуру столбцам ('//', '\', 'xx', '...')
- Тени (shadow) — создают эффект объема
- Скругленные углы — делают графики более современными
- Различные маркеры — дополнительно выделяют важные точки
Параметр стиля | Значения | Эффект |
---|---|---|
color | 'blue', '#5DA5DA', (0.2, 0.4, 0.6) | Определяет цвет столбцов |
alpha | 0.0 – 1.0 | Контролирует прозрачность |
edgecolor | цветовые значения | Цвет границ столбцов |
hatch | '/', '\', 'x', '+', '*', '.' | Добавляет текстуру столбцам |
linewidth | числовое значение | Толщина границ столбцов |
Продвинутые функции столбчатых диаграмм Matplotlib
Matplotlib не ограничивается базовыми возможностями — библиотека предлагает мощные средства для создания сложных визуализаций, способных эффективно представлять многоуровневые данные. Продвинутые функции позволяют визуализировать нюансы, которые часто остаются незамеченными в простых графиках. 🔍
Рассмотрим создание диаграммы с доверительными интервалами, что критически важно для представления статистических данных с учётом погрешностей:
# Данные с доверительными интервалами
categories = ['A', 'B', 'C', 'D', 'E']
values = [25, 40, 30, 55, 15]
errors = [3, 5, 2, 4, 3]
plt.figure(figsize=(12, 7))
plt.bar(categories, values, yerr=errors, capsize=5,
error_kw={'ecolor': '#D62728', 'linewidth': 2})
plt.title('Диаграмма с доверительными интервалами')
plt.ylabel('Значения с погрешностью')
plt.show()
Для более детального анализа полезны столбчатые диаграммы с наложенными линиями тренда:
fig, ax1 = plt.subplots(figsize=(12, 7))
# Столбчатая диаграмма
ax1.bar(categories, values, alpha=0.7, color='#5DA5DA')
ax1.set_ylabel('Значения столбцов')
# Создание второй оси Y для линейного тренда
ax2 = ax1.twinx()
trend = [20, 28, 35, 42, 50] # Линия тренда
ax2.plot(categories, trend, color='#D62728', marker='o', linewidth=2)
ax2.set_ylabel('Тренд')
plt.title('Столбчатая диаграмма с наложенной линией тренда')
plt.show()
Для многоуровневых данных идеально подходят иерархические столбчатые диаграммы с использованием вложенных структур:
from matplotlib import gridspec
# Иерархические данные
main_categories = ['Группа 1', 'Группа 2']
sub_categories = ['A', 'B', 'C']
data = [[30, 25, 15], [20, 35, 25]] # Значения для каждой подкатегории в группе
fig = plt.figure(figsize=(14, 8))
gs = gridspec.GridSpec(2, 1, height_ratios=[1, 5])
# Верхняя диаграмма для основных групп
ax1 = plt.subplot(gs[0])
main_total = [sum(group) for group in data]
ax1.bar(main_categories, main_total, color=['#5DA5DA', '#FAA43A'])
ax1.set_title('Общие значения по группам')
ax1.set_xticklabels([])
# Нижняя диаграмма для подкатегорий
ax2 = plt.subplot(gs[1])
x = np.arange(len(sub_categories))
width = 0.35
for i, group in enumerate(data):
offset = width * (i – 0.5)
ax2.bar(x + offset, group, width,
label=main_categories[i],
color=['#5DA5DA', '#FAA43A'][i])
ax2.set_xticks(x)
ax2.set_xticklabels(sub_categories)
ax2.set_title('Детализация по подкатегориям')
ax2.legend()
plt.tight_layout()
plt.show()
Matplotlib позволяет создавать диаграммы с динамическим порогом, которые визуально выделяют значения выше или ниже определенного уровня:
fig, ax = plt.subplots(figsize=(12, 7))
threshold = 30
# Создаем цветовое кодирование в зависимости от порога
colors = ['#5DA5DA' if x < threshold else '#D62728' for x in values]
bars = ax.bar(categories, values, color=colors)
ax.axhline(y=threshold, color='black', linestyle='--')
ax.text(len(categories)-1, threshold+1, f'Порог: {threshold}',
ha='right', va='bottom')
ax.set_title('Столбчатая диаграмма с пороговым значением')
plt.show()
Для представления временных рядов эффективно использовать диаграмму с заполненной областью под кривой:
months = ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн']
values_by_month = [10, 15, 25, 30, 20, 35]
fig, ax = plt.subplots(figsize=(12, 7))
ax.bar(months, values_by_month, color='#5DA5DA', alpha=0.7)
ax.plot(months, values_by_month, 'o-', color='#D62728', linewidth=2)
ax.fill_between(months, values_by_month, alpha=0.3, color='#D62728')
ax.set_title('Комбинированная диаграмма с заполненной областью')
plt.show()
Продвинутой функцией является возможность создания интерактивных аннотаций, которые появляются при наведении на столбцы (требует использования plt.gcf().canvas.mpl_connect):
from matplotlib.backend_bases import MouseEvent
fig, ax = plt.subplots(figsize=(12, 7))
bars = ax.bar(categories, values)
annot = ax.annotate("", xy=(0,0), xytext=(10,10),
textcoords="offset points",
bbox=dict(boxstyle="round", fc="white", alpha=0.8),
arrowprops=dict(arrowstyle="->"))
annot.set_visible(False)
def update_annot(bar, ind):
x = bar.get_x() + bar.get_width()/2
y = bar.get_height()
annot.xy = (x, y)
text = f"{categories[ind]}: {values[ind]}"
annot.set_text(text)
def hover(event):
vis = annot.get_visible()
if event.inaxes == ax:
for i, bar in enumerate(bars):
cont, _ = bar.contains(event)
if cont:
update_annot(bar, i)
annot.set_visible(True)
fig.canvas.draw_idle()
return
if vis:
annot.set_visible(False)
fig.canvas.draw_idle()
fig.canvas.mpl_connect("motion_notify_event", hover)
plt.show()
Сравнительный анализ данных через столбчатые графики
Столбчатые диаграммы особенно эффективны для сравнительного анализа данных. Они позволяют наглядно противопоставить категории, группы или временные периоды, делая сложные данные интуитивно понятными. Рассмотрим ключевые методы сравнительного анализа через столбчатые графики в Matplotlib. 📈
Мария Соколова, руководитель отдела аналитики В нашем крупном ритейл-проекте требовалось проанализировать эффективность работы 120 торговых точек по 8 ключевым метрикам. Представить такой объем данных руководству в табличном формате было бы катастрофой — никто бы не увидел главного. Я создала систему визуализации на основе продвинутых столбчатых диаграмм Matplotlib с функцией drill-down. На верхнем уровне были регионы, затем города, и наконец отдельные магазины. Цветовое кодирование мгновенно выделяло проблемные зоны. Использование нормализованных данных позволило объективно сравнивать магазины разного масштаба. Благодаря этой системе визуализации за один месяц мы выявили и устранили проблемы с эффективностью, что привело к росту прибыли на 14% в следующем квартале. Ключом к успеху стал именно сравнительный анализ через грамотно структурированные столбчатые диаграммы.
Сравнение групп данных — базовая функция столбчатых диаграмм. Давайте рассмотрим, как эффективно визуализировать несколько групп для сравнения:
categories = ['Кат. 1', 'Кат. 2', 'Кат. 3', 'Кат. 4', 'Кат. 5']
data_2023 = [15, 30, 25, 40, 20]
data_2024 = [20, 25, 30, 45, 35]
data_2025 = [25, 35, 20, 50, 30]
x = np.arange(len(categories))
width = 0.25
fig, ax = plt.subplots(figsize=(14, 8))
bar1 = ax.bar(x – width, data_2023, width, label='2023', color='#1f77b4')
bar2 = ax.bar(x, data_2024, width, label='2024', color='#ff7f0e')
bar3 = ax.bar(x + width, data_2025, width, label='2025', color='#2ca02c')
ax.set_title('Сравнение показателей за 2023-2025 годы')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()
# Добавление подписей со значениями
for bars in [bar1, bar2, bar3]:
for bar in bars:
height = bar.get_height()
ax.annotate(f'{height}',
xy=(bar.get_x() + bar.get_width()/2, height),
xytext=(0, 3),
textcoords="offset points",
ha='center', va='bottom')
plt.show()
Для сравнения процентных долей или состава различных категорий эффективно использовать нормализованные столбчатые диаграммы:
regions = ['Регион A', 'Регион B', 'Регион C']
segment1 = [30, 25, 40]
segment2 = [40, 35, 25]
segment3 = [30, 40, 35]
# Расчет процентных долей
totals = np.array([sum(x) for x in zip(segment1, segment2, segment3)])
segment1_norm = np.array(segment1) / totals * 100
segment2_norm = np.array(segment2) / totals * 100
segment3_norm = np.array(segment3) / totals * 100
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8))
# Обычная накопительная диаграмма
ax1.bar(regions, segment1, label='Сегмент 1', color='#1f77b4')
ax1.bar(regions, segment2, bottom=segment1, label='Сегмент 2', color='#ff7f0e')
ax1.bar(regions, segment3, bottom=np.array(segment1)+np.array(segment2),
label='Сегмент 3', color='#2ca02c')
ax1.set_title('Абсолютные значения')
ax1.legend()
# Нормализованная диаграмма (100%)
ax2.bar(regions, segment1_norm, label='Сегмент 1', color='#1f77b4')
ax2.bar(regions, segment2_norm, bottom=segment1_norm,
label='Сегмент 2', color='#ff7f0e')
ax2.bar(regions, segment3_norm, bottom=segment1_norm+segment2_norm,
label='Сегмент 3', color='#2ca02c')
ax2.set_title('Процентное распределение')
ax2.set_ylabel('Процент (%)')
ax2.set_ylim(0, 100)
plt.show()
Для выявления разницы между двумя наборами данных полезно создавать диаграммы отклонений:
categories = ['Продукт A', 'Продукт B', 'Продукт C', 'Продукт D', 'Продукт E']
baseline = [100, 100, 100, 100, 100] # Базовые значения
current = [110, 95, 130, 85, 120] # Текущие значения
# Расчет отклонений
differences = [c – b for c, b in zip(current, baseline)]
fig, ax = plt.subplots(figsize=(14, 8))
bars = ax.bar(categories, differences)
# Цветовое кодирование в зависимости от положительного/отрицательного отклонения
for i, diff in enumerate(differences):
if diff >= 0:
bars[i].set_color('#2ca02c') # Зеленый для положительных
else:
bars[i].set_color('#d62728') # Красный для отрицательных
ax.axhline(y=0, color='black', linestyle='-', linewidth=0.5)
ax.set_title('Диаграмма отклонений от базовых значений')
ax.set_ylabel('Отклонение (%)')
# Добавление подписей к столбцам
for bar in bars:
height = bar.get_height()
sign = "+" if height > 0 else ""
ax.text(bar.get_x() + bar.get_width()/2, height + (5 если height > 0 else -5),
f'{sign}{height}%', ha='center', va='bottom' если height > 0 иначе 'top')
plt.show()
Тип сравнения | Применение | Ключевые параметры Matplotlib |
---|---|---|
Между группами | Сравнение разных категорий/сегментов | bar() , группировка по позиции (x + width ) |
Между периодами | Временное сравнение | bar() с настройкой ширины, цвета по периодам |
Состав целого | Структурный анализ | bar() с параметром bottom |
Отклонения | Анализ различий | bar() с центральной осью, цветовое кодирование |
Ранжирование | Сортировка по показателям | bar() с предварительной сортировкой данных |
Для еще более глубокого анализа полезно создавать диаграммы с логарифмической шкалой, которые позволяют сравнивать данные с большим разбросом значений:
categories = ['A', 'B', 'C', 'D', 'E']
values = [10, 100, 1000, 10000, 100000]
fig, ax = plt.subplots(figsize=(12, 7))
ax.bar(categories, values)
ax.set_yscale('log')
ax.set_title('Столбчатая диаграмма с логарифмической шкалой')
ax.set_ylabel('Значения (лог. шкала)')
for bar in ax.patches:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2, height*1.1,
f'{int(height):,}', ha='center', va='bottom')
plt.show()
Задумываетесь о профессиональном развитии в области анализа данных? Не можете определиться, какая IT-специальность подходит именно вам? Пройдите Тест на профориентацию от Skypro и узнайте, есть ли у вас предрасположенность к профессиям, связанным с обработкой и визуализацией данных. Тест поможет определить, станет ли разработка визуализаций с использованием Matplotlib и Python вашей сильной стороной в профессиональной карьере.
Практические кейсы использования столбчатых диаграмм
Столбчатые диаграммы имеют широкий спектр применения в различных областях — от бизнес-аналитики до научных исследований. Разберем несколько практических кейсов с готовыми решениями, которые можно адаптировать под ваши задачи. 💡
Кейс 1: Анализ продаж по регионам и категориям товаров
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# Создаем примерные данные продаж
data = {
'Регион': ['Запад', 'Запад', 'Запад', 'Восток', 'Восток', 'Восток', 'Север', 'Север', 'Север'],
'Категория': ['Электроника', 'Одежда', 'Продукты', 'Электроника', 'Одежда', 'Продукты', 'Электроника', 'Одежда', 'Продукты'],
'Продажи': [120, 85, 95, 140, 70, 110, 95, 110, 80]
}
df = pd.DataFrame(data)
# Агрегируем данные для диаграммы
pivoted = df.pivot_table(index='Регион', columns='Категория', values='Продажи')
# Создаем диаграмму
ax = pivoted.plot(kind='bar', figsize=(14, 8), width=0.7)
ax.set_title('Продажи по регионам и категориям товаров')
ax.set_ylabel('Объем продаж (тыс. ₽)')
ax.set_xlabel('Регион')
ax.legend(title='Категория')
# Добавляем подписи значений
for container in ax.containers:
ax.bar_label(container, fmt='%.0f')
plt.tight_layout()
plt.show()
Кейс 2: Анализ эффективности маркетинговых кампаний
# Данные эффективности маркетинговых каналов
channels = ['SEO', 'PPC', 'Email', 'SMM', 'Affiliate']
cpa = [35, 50, 20, 45, 30] # Стоимость привлечения клиента
conversion_rate = [3\.2, 5.1, 2.8, 4.5, 2.0] # Процент конверсии
fig, ax1 = plt.subplots(figsize=(14, 8))
# CPA – столбцы
x = np.arange(len(channels))
width = 0.4
bars = ax1.bar(x – width/2, cpa, width, label='CPA (₽)', color='#5DA5DA')
ax1.set_ylabel('Стоимость привлечения (₽)')
ax1.set_title('Сравнение эффективности маркетинговых каналов')
# Конверсия – на второй оси Y
ax2 = ax1.twinx()
bars2 = ax2.bar(x + width/2, conversion_rate, width, label='Конверсия (%)', color='#F17CB0')
ax2.set_ylabel('Конверсия (%)')
# Совместная легенда
lines1, labels1 = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right')
ax1.set_xticks(x)
ax1.set_xticklabels(channels)
# ROI – эффективность (рассчитываем условно)
roi = [1000/c * cr for c, cr in zip(cpa, conversion_rate)]
for i, (c, cr, r) in enumerate(zip(cpa, conversion_rate, roi)):
ax1.annotate(f'ROI: {r:.1f}',
xy=(i, c + 2),
ha='center', va='bottom',
bbox=dict(boxstyle='round,pad=0.3', fc='#F5F5F5', alpha=0.8))
plt.tight_layout()
plt.show()
Кейс 3: Анализ временных рядов с сезонностью
# Данные помесячных продаж за 3 года
months = ['Янв', 'Фев', 'Март', 'Апр', 'Май', 'Июнь', 'Июль', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек']
sales_2023 = [45, 50, 65, 70, 80, 95, 100, 90, 75, 65, 70, 85]
sales_2024 = [50, 55, 70, 75, 85, 100, 105, 95, 80, 70, 75, 90]
sales_2025 = [55, 60, 75, 80, 90, 105, 110, 100, 85, 75, 80, 95]
# Создаем фигуру с двумя диаграммами
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(16, 12), height_ratios=[2, 1])
# Диаграмма 1: Сравнение по годам
width = 0.25
x = np.arange(len(months))
ax1.bar(x – width, sales_2023, width, label='2023', color='#5DA5DA')
ax1.bar(x, sales_2024, width, label='2024', color='#F17CB0')
ax1.bar(x + width, sales_2025, width, label='2025', color='#60BD68')
ax1.set_title('Помесячные продажи за 2023-2025 годы')
ax1.set_ylabel('Объем продаж (млн ₽)')
ax1.set_xticks(x)
ax1.set_xticklabels(months)
ax1.legend()
ax1.grid(axis='y', alpha=0.3)
# Диаграмма 2: Анализ прироста по годам
growth_2024 = [(new – old)/old*100 for old, new in zip(sales_2023, sales_2024)]
growth_2025 = [(new – old)/old*100 for old, new in zip(sales_2024, sales_2025)]
ax2.bar(x – width/2, growth_2024, width, label='Прирост 2024/2023', color='#B276B2')
ax2.bar(x + width/2, growth_2025, width, label='Прирост 2025/2024', color='#DECF3F')
ax2.set_title('Ежегодный прирост продаж (в %)')
ax2.set_ylabel('Прирост (%)')
ax2.set_xticks(x)
ax2.set_xticklabels(months)
ax2.legend()
ax2.grid(axis='y', alpha=0.3)
# Добавляем среднегодовые линии на первую диаграмму
avg_2023 = np.mean(sales_2023)
avg_2024 = np.mean(sales_2024)
avg_2025 = np.mean(sales_2025)
ax1.axhline(y=avg_2023, linestyle='--', color='#5DA5DA', alpha=0.7)
ax1.axhline(y=avg_2024, linestyle='--', color='#F17CB0', alpha=0.7)
ax1.axhline(y=avg_2025, linestyle='--', color='#60BD68', alpha=0.7)
plt.tight_layout()
plt.show()
Кейс 4: Сравнительный анализ ключевых показателей эффективности (KPI)
# Данные KPI по отделам
departments = ['Продажи', 'Маркетинг', 'Разработка', 'Поддержка', 'HR']
target = [100, 100, 100, 100, 100] # Целевые показатели
actual = [110, 95, 105, 90, 115] # Фактические результаты
# Расчет процента выполнения плана
performance = [a/t*100 for a, t in zip(actual, target)]
fig, ax = plt.subplots(figsize=(14, 8))
# Создаем цветовую карту в зависимости от выполнения KPI
colors = ['#D62728' if p < 95 else '#FFA500' if p < 100 else '#60BD68' for p in performance]
bars = ax.bar(departments, performance, color=colors)
ax.set_title('Выполнение KPI по отделам')
ax.set_ylabel('Процент выполнения плана (%)')
ax.axhline(y=100, linestyle='--', color='black', alpha=0.7, label='Целевой уровень')
ax.legend()
# Добавляем подписи
for i, bar in enumerate(bars):
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2, height + 1,
f'{height:.1f}%', ha='center', va='bottom')
ax.text(bar.get_x() + bar.get_width()/2, height/2,
f'План: {target[i]}\nФакт: {actual[i]}', ha='center', va='center',
color='white', fontweight='bold')
# Добавляем цветовую легенду
from matplotlib.patches import Patch
legend_elements = [
Patch(facecolor='#D62728', label='< 95% (Критично)'),
Patch(facecolor='#FFA500', label='95-100% (Требует внимания)'),
Patch(facecolor='#60BD68', label='> 100% (Выполнено)')
]
ax.legend(handles=legend_elements, loc='upper right')
plt.tight_layout()
plt.show()
Столбчатые диаграммы Matplotlib — универсальный инструмент визуализации, который превращает сухие цифры в наглядные образы. От базовых сравнений до многоуровневого анализа данных, они помогают делать быстрые и точные выводы. Профессиональная визуализация данных — это не просто технический навык, а искусство рассказывать истории через графики, делая сложное понятным. Овладев техниками создания и кастомизации столбчатых диаграмм в Python, вы сможете доносить ключевую информацию быстрее и эффективнее, что критически важно в принятии решений на основе данных.