Столбчатая диаграмма Python Matplotlib: создание красивых графиков

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Для кого эта статья:

  • Разработчики и аналитики данных, желающие улучшить свои навыки визуализации
  • Студенты и начинающие специалисты в области программирования на Python
  • Профессионалы из области бизнеса и науки, которым нужно представлять данные в наглядном виде

    Столбчатые диаграммы — мощный инструмент визуализации, позволяющий мгновенно считывать сравнительные данные и выявлять ключевые тренды. Python с библиотекой Matplotlib даёт разработчикам безграничные возможности для создания не просто информативных, но и эстетически привлекательных графиков. Будь то анализ продаж, научное исследование или презентация для руководства — умение создавать профессиональные столбчатые диаграммы выделит вас среди других специалистов и сделает ваши данные понятными даже неподготовленной аудитории. 📊

Хотите освоить не только визуализацию данных, но и весь спектр возможностей Python? Курс «Python-разработчик» с нуля от Skypro — это ваш путь к профессиональному владению инструментами визуализации данных. На курсе вы освоите не только Matplotlib для создания впечатляющих диаграмм, но и другие библиотеки для анализа данных, что сделает вас востребованным специалистом на рынке труда.

Основы создания столбчатых диаграмм в Matplotlib

Столбчатая диаграмма (bar chart) — один из самых популярных и интуитивно понятных способов визуализации категориальных данных. Matplotlib предоставляет простой и гибкий интерфейс для их создания. Начнем с базового примера. 🚀

Для создания простейшей столбчатой диаграммы требуется всего несколько строк кода:

Python
Скопировать код
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')

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

Python
Скопировать код
# Данные для нескольких групп
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(), которая особенно полезна когда названия ваших категорий длинные:

Python
Скопировать код
plt.figure(figsize=(10, 8))
plt.barh(categories, values)
plt.title('Горизонтальная столбчатая диаграмма')
plt.xlabel('Значения')
plt.ylabel('Категории')
plt.show()

Для отображения составных частей целого удобно использовать накопительные (stacked) столбчатые диаграммы:

Python
Скопировать код
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()
Кинга Идем в IT: пошаговый план для смены профессии

Настройка внешнего вида столбцов в диаграммах Python

Привлекательность визуализации напрямую влияет на восприятие данных. Matplotlib предлагает обширный инструментарий для настройки внешнего вида столбцов, что помогает не только сделать диаграммы эстетически приятными, но и более информативными. 🎨

Алексей Петров, старший аналитик данных Однажды мне поручили подготовить отчёт для совета директоров. Первую версию с базовыми столбчатыми диаграммами руководитель отправил на доработку: «Это выглядит как курсовая первокурсника». Я потратил вечер на изучение возможностей кастомизации в Matplotlib — и следующая презентация вызвала восторг. Добавив градиентную заливку столбцов, настроив прозрачность и текстуры, добавив аннотации и усовершенствовав сетку, я превратил скучные графики в информационно-насыщенный визуальный нарратив. Один из директоров даже спросил, какой сторонний сервис я использовал для создания таких диаграмм. Когда я ответил, что это чистый Python с Matplotlib, на следующей неделе меня попросили провести мини-семинар для аналитического отдела.

Начнём с базовых параметров настройки, которые моментально преобразят ваши диаграммы:

Python
Скопировать код
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()

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

Python
Скопировать код
colors = ['#5DA5DA', '#FAA43A', '#60BD68', '#F17CB0', '#B2912F']
plt.figure(figsize=(12, 7))
bars = plt.bar(categories, values, color=colors)
plt.title('Диаграмма с индивидуальными цветами столбцов')
plt.show()

Добавление значений над столбцами значительно улучшает интерпретацию данных:

Python
Скопировать код
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()

Использование различных стилей и тем позволяет быстро изменить общий внешний вид диаграммы:

Python
Скопировать код
plt.style.use('ggplot') # Популярные стили: 'seaborn', 'dark_background', 'bmh'
plt.figure(figsize=(12, 7))
plt.bar(categories, values)
plt.title('Диаграмма с использованием стиля ggplot')
plt.show()

Для продвинутой визуализации можно использовать градиентную заливку столбцов:

Python
Скопировать код
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)Определяет цвет столбцов
alpha0.0 – 1.0Контролирует прозрачность
edgecolorцветовые значенияЦвет границ столбцов
hatch'/', '\', 'x', '+', '*', '.'Добавляет текстуру столбцам
linewidthчисловое значениеТолщина границ столбцов

Продвинутые функции столбчатых диаграмм Matplotlib

Matplotlib не ограничивается базовыми возможностями — библиотека предлагает мощные средства для создания сложных визуализаций, способных эффективно представлять многоуровневые данные. Продвинутые функции позволяют визуализировать нюансы, которые часто остаются незамеченными в простых графиках. 🔍

Рассмотрим создание диаграммы с доверительными интервалами, что критически важно для представления статистических данных с учётом погрешностей:

Python
Скопировать код
# Данные с доверительными интервалами
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()

Для более детального анализа полезны столбчатые диаграммы с наложенными линиями тренда:

Python
Скопировать код
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()

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

Python
Скопировать код
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 позволяет создавать диаграммы с динамическим порогом, которые визуально выделяют значения выше или ниже определенного уровня:

Python
Скопировать код
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()

Для представления временных рядов эффективно использовать диаграмму с заполненной областью под кривой:

Python
Скопировать код
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):

Python
Скопировать код
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% в следующем квартале. Ключом к успеху стал именно сравнительный анализ через грамотно структурированные столбчатые диаграммы.

Сравнение групп данных — базовая функция столбчатых диаграмм. Давайте рассмотрим, как эффективно визуализировать несколько групп для сравнения:

Python
Скопировать код
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()

Для сравнения процентных долей или состава различных категорий эффективно использовать нормализованные столбчатые диаграммы:

Python
Скопировать код
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()

Для выявления разницы между двумя наборами данных полезно создавать диаграммы отклонений:

Python
Скопировать код
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() с предварительной сортировкой данных

Для еще более глубокого анализа полезно создавать диаграммы с логарифмической шкалой, которые позволяют сравнивать данные с большим разбросом значений:

Python
Скопировать код
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: Анализ продаж по регионам и категориям товаров

Python
Скопировать код
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: Анализ эффективности маркетинговых кампаний

Python
Скопировать код
# Данные эффективности маркетинговых каналов
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: Анализ временных рядов с сезонностью

Python
Скопировать код
# Данные помесячных продаж за 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)

Python
Скопировать код
# Данные 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, вы сможете доносить ключевую информацию быстрее и эффективнее, что критически важно в принятии решений на основе данных.