Как построить столбчатую диаграмму с помощью plot bar в Python

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

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

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

  • аналитики данных
  • программисты и разработчики
  • студенты и начинающие специалисты в области Python

    Визуализация данных — это мощный инструмент в арсенале любого аналитика или программиста, позволяющий превратить сухие числа в наглядные истории. Особое место среди всех типов визуализаций занимают столбчатые диаграммы — они интуитивно понятны даже неподготовленному зрителю и при этом способны передать сложные зависимости между данными. Создание таких диаграмм в Python с помощью matplotlib.pyplot.bar() открывает безграничные возможности для кастомизации и представления информации именно так, как вам нужно. От базовых диаграмм до многоуровневых визуализаций — всё доступно при правильном использовании инструментария Python. 📊

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

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

Столбчатые диаграммы являются одним из фундаментальных способов визуализации категориальных данных. В Python создать такую диаграмму можно с помощью функции bar() из библиотеки matplotlib.pyplot. Разберём базовый синтаксис и необходимые компоненты для построения простой столбчатой диаграммы. 🧩

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

Python
Скопировать код
import matplotlib.pyplot as plt
import numpy as np

Базовый синтаксис функции bar() выглядит следующим образом:

Python
Скопировать код
plt.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)

Где:

  • x – координаты расположения столбцов по оси X
  • height – высота каждого столбца (значения по оси Y)
  • width – ширина столбцов (по умолчанию 0.8)
  • bottom – начальная позиция столбцов по оси Y (по умолчанию 0)
  • align – выравнивание столбцов относительно x-координат ('center' или 'edge')

Создадим простую столбчатую диаграмму для визуализации продаж различных товаров:

Python
Скопировать код
categories = ['Товар A', 'Товар B', 'Товар C', 'Товар D', 'Товар E']
values = [23, 45, 56, 78, 32]

plt.figure(figsize=(10, 6))
plt.bar(categories, values)
plt.title('Продажи по категориям товаров')
plt.xlabel('Категории')
plt.ylabel('Объем продаж (тыс. шт.)')
plt.show()

В этом примере мы создаём фигуру размером 10х6 дюймов, строим столбчатую диаграмму с пятью категориями, добавляем заголовок и подписи осей.

ПараметрОписаниеПример значения
figsizeРазмер фигуры в дюймах (ширина, высота)(10, 6)
titleЗаголовок диаграммы'Продажи по категориям товаров'
xlabelПодпись оси X'Категории'
ylabelПодпись оси Y'Объем продаж (тыс. шт.)'
barФункция для создания столбчатой диаграммыplt.bar(categories, values)

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

Python
Скопировать код
years = np.arange(2020, 2025)
revenue = [1\.2, 1.5, 2.0, 2.8, 3.1]

plt.bar(years, revenue)
plt.title('Годовая выручка компании')
plt.xlabel('Год')
plt.ylabel('Выручка (млн $)')
plt.xticks(years) # Указываем конкретные метки на оси X
plt.show()

Обратите внимание на функцию plt.xticks(), которая позволяет явно указать метки делений на оси X, что особенно полезно при работе с числовыми данными.

Алексей Петров, Data Science инструктор

Когда я только начинал преподавать визуализацию данных, многие студенты сталкивались с проблемой: их диаграммы выглядели примитивно и не передавали суть данных. Один студент принёс проект с анализом цен на недвижимость, где все столбцы сливались в одну сплошную массу. Я показал ему базовые настройки bar() — от правильного размера фигуры до корректных подписей осей. Через неделю его презентация произвела фурор: чёткие столбцы разных районов города с градиентной заливкой по цене наглядно демонстрировали рыночные тренды. Иногда даже базовые инструменты plt.bar() при правильном применении творят чудеса с восприятием данных.

Кинга Идем в IT: пошаговый план для смены профессии

Настройка внешнего вида диаграмм через параметры

Функция bar() библиотеки matplotlib предоставляет обширные возможности для настройки внешнего вида диаграмм. Эти параметры позволяют создавать профессионально выглядящие визуализации, адаптированные под конкретные задачи. 🎨

Рассмотрим основные параметры для кастомизации столбцов:

  • color – цвет столбцов (один цвет или список цветов)
  • edgecolor – цвет границ столбцов
  • linewidth – толщина границы столбцов
  • alpha – прозрачность столбцов (от 0 до 1)
  • hatch – узор заливки столбцов ('/', '', '|', '-', '+', 'x', 'o', 'O', '.', '*')

Вот пример использования этих параметров:

Python
Скопировать код
categories = ['Кат. A', 'Кат. B', 'Кат. C', 'Кат. D', 'Кат. E']
values = [23, 45, 56, 78, 32]

plt.figure(figsize=(12, 7))
plt.bar(categories, values, 
color=['#ff9999', '#66b3ff', '#99ff99', '#ffcc99', '#c2c2f0'],
edgecolor='black',
linewidth=1.5,
alpha=0.7,
width=0.6)

plt.title('Настроенная диаграмма', fontsize=16)
plt.xlabel('Категории', fontsize=14)
plt.ylabel('Значения', fontsize=14)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()

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

Python
Скопировать код
# Используем стиль ggplot
plt.style.use('ggplot')

# Создаем диаграмму со специфической настройкой
plt.figure(figsize=(12, 7))
bars = plt.bar(categories, values, width=0.7)

# Добавляем значения над каждым столбцом
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=12)

plt.title('Диаграмма со значениями', fontsize=16)
plt.tight_layout() # Автоматически оптимизирует расположение элементов
plt.show()

Можно настроить расположение и вращение подписей категорий, что особенно полезно при длинных названиях:

Python
Скопировать код
long_categories = ['Очень длинная категория A', 'Длинное название B', 
'Еще одно длинное название C', 'Категория D с подробностями',
'Последняя длинная категория E']

plt.figure(figsize=(12, 8))
plt.bar(long_categories, values)
plt.xticks(rotation=45, ha='right', fontsize=12)
plt.tight_layout()
plt.show()
Параметр стиляФункцияВлияние на визуализацию
colorОпределяет цвет столбцовУлучшает различимость категорий
alphaУправляет прозрачностьюПозволяет видеть перекрывающиеся элементы
edgecolorОпределяет цвет границыУлучшает четкость столбцов
hatchЗадает шаблон заливкиДобавляет текстуру для черно-белой печати
widthУстанавливает ширину столбцовВлияет на пространство между столбцами
gridДобавляет линии сеткиУлучшает читаемость значений

Использование различных стилей matplotlib может радикально изменить внешний вид диаграммы. Доступные стили в версии 2025 года включают: 'default', 'classic', 'Solarize_Light2', 'bmh', 'dark_background', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-talk', 'seaborn-white', 'tableau-colorblind10'.

Группировка и штабелирование данных на bar-диаграммах

При анализе многомерных данных требуется визуализировать несколько групп категориальных данных одновременно. Matplotlib предоставляет два основных способа такой визуализации: сгруппированные (grouped) и штабелированные (stacked) столбчатые диаграммы. 📊

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

Python
Скопировать код
import numpy as np

# Данные для примера
categories = ['Кат. A', 'Кат. B', 'Кат. C', 'Кат. D']
group1 = [10, 24, 35, 18]
group2 = [15, 30, 25, 22]
group3 = [12, 18, 30, 28]

# Задаем позиции для категорий
x = np.arange(len(categories))
width = 0.25 # Ширина столбца

fig, ax = plt.subplots(figsize=(12, 7))

# Создаем сгруппированные столбцы
bars1 = ax.bar(x – width, group1, width, label='Группа 1', color='#5DA5DA')
bars2 = ax.bar(x, group2, width, label='Группа 2', color='#FAA43A')
bars3 = ax.bar(x + width, group3, width, label='Группа 3', color='#60BD68')

# Добавляем подписи и легенду
ax.set_title('Сгруппированная столбчатая диаграмма', fontsize=16)
ax.set_xlabel('Категории', fontsize=14)
ax.set_ylabel('Значения', fontsize=14)
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()

plt.show()

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

Python
Скопировать код
# Создаем штабелированную диаграмму
fig, ax = plt.subplots(figsize=(12, 7))

# Первая группа начинается с нуля
bars1 = ax.bar(categories, group1, label='Группа 1', color='#5DA5DA')

# Вторая группа начинается там, где заканчивается первая
bars2 = ax.bar(categories, group2, bottom=group1, label='Группа 2', color='#FAA43A')

# Третья группа начинается там, где заканчивается вторая
bottom_values = [g1 + g2 for g1, g2 in zip(group1, group2)]
bars3 = ax.bar(categories, group3, bottom=bottom_values, label='Группа 3', color='#60BD68')

ax.set_title('Штабелированная столбчатая диаграмма', fontsize=16)
ax.set_xlabel('Категории', fontsize=14)
ax.set_ylabel('Общая сумма', fontsize=14)
ax.legend()

plt.show()

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

Python
Скопировать код
# Данные для сложной диаграммы
men_means = [20, 35, 30, 35]
women_means = [25, 32, 34, 20]
men_std = [2, 3, 4, 1]
women_std = [3, 5, 2, 3]
men_inner = [15, 25, 20, 22]
women_inner = [18, 22, 28, 15]

width = 0.35
fig, ax = plt.subplots(figsize=(12, 7))
x = np.arange(len(categories))

# Создаем основные столбцы
p1 = ax.bar(x – width/2, men_means, width, yerr=men_std, label='Мужчины')
p2 = ax.bar(x + width/2, women_means, width, yerr=women_std, label='Женщины')

# Добавляем внутренние столбцы другого цвета
p3 = ax.bar(x – width/2, men_inner, width, label='Мужчины (ключевая группа)', 
color='darkblue', alpha=0.6)
p4 = ax.bar(x + width/2, women_inner, width, label='Женщины (ключевая группа)', 
color='darkred', alpha=0.6)

ax.set_title('Сложная группированная диаграмма', fontsize=16)
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()

plt.show()

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

Python
Скопировать код
# Нормализация данных для отображения процентов
def normalize_data(data_list):
totals = [sum(data) for data in zip(*data_list)]
normalized_data = []
for data in data_list:
normalized_data.append([val/total*100 for val, total in zip(data, totals)])
return normalized_data

# Данные
group1 = [10, 24, 35, 18]
group2 = [15, 30, 25, 22]
group3 = [12, 18, 30, 28]
data_list = [group1, group2, group3]

# Нормализуем данные
normalized_data = normalize_data(data_list)

fig, ax = plt.subplots(figsize=(12, 7))

# Создаем нормализованную штабелированную диаграмму
ax.bar(categories, normalized_data[0], label='Группа 1', color='#5DA5DA')
ax.bar(categories, normalized_data[1], bottom=normalized_data[0], 
label='Группа 2', color='#FAA43A')
bottom_values = [a + b for a, b in zip(normalized_data[0], normalized_data[1])]
ax.bar(categories, normalized_data[2], bottom=bottom_values, 
label='Группа 3', color='#60BD68')

ax.set_title('Процентное распределение по категориям', fontsize=16)
ax.set_xlabel('Категории', fontsize=14)
ax.set_ylabel('Процент (%)', fontsize=14)
ax.legend()

# Добавляем проценты к каждому сегменту
for i, cat in enumerate(categories):
ax.text(i, 50, f'{int(sum([data[i] for data in normalized_data]))}%', 
ha='center', va='center', fontweight='bold', color='black')

plt.show()

Мария Смирнова, Аналитик данных

В 2023 году мне поручили подготовить отчёт по продажам для руководства — исследовать эффективность нескольких рекламных каналов в разных регионах. Простая таблица из 30 строк и 10 столбцов с цифрами вызывала только недоумение у директоров. Я создала сгруппированную столбчатую диаграмму, где каждый регион представлял группу столбцов, а разные цвета столбцов отображали разные каналы. Результат превзошёл ожидания — в течение пяти минут презентации СЕО сразу выделил два наиболее эффективных канала и три региона с аномально низкими показателями. Решение о перераспределении рекламного бюджета было принято на месте. Группировка данных в визуализации позволила мгновенно увидеть картину, которая была скрыта в таблицах цифр.

Добавление подписей, легенд и цветовое оформление

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

Рассмотрим, как добавлять значения непосредственно на столбцы:

Python
Скопировать код
categories = ['Кат. A', 'Кат. B', 'Кат. C', 'Кат. D', 'Кат. E']
values = [23, 45, 56, 78, 32]

fig, ax = plt.subplots(figsize=(12, 7))
bars = ax.bar(categories, values, color='skyblue')

# Добавляем значения над столбцами
for bar in bars:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., height + 1,
f'{height:,}', # Форматирование с разделением тысяч
ha='center', va='bottom', fontsize=12, fontweight='bold')

ax.set_title('Диаграмма с подписями значений', fontsize=16)
plt.show()

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

Python
Скопировать код
categories = ['Янв', 'Фев', 'Мар', 'Апр', 'Май']
values = [12500, 17800, 22350, 19800, 24500]
target = 20000

fig, ax = plt.subplots(figsize=(12, 7))

# Используем цветовое кодирование в зависимости от значения
colors = ['red' if x < target else 'green' for x in values]
bars = ax.bar(categories, values, color=colors, alpha=0.8, edgecolor='black')

# Добавляем целевую линию
ax.axhline(y=target, color='red', linestyle='--', alpha=0.7, linewidth=2)
ax.text(len(categories)-0.5, target+500, f'Цель: {target:,}', 
color='red', fontweight='bold')

# Добавляем подписи значений и процент от цели
for bar in bars:
height = bar.get_height()
percentage = (height / target) * 100
ax.text(bar.get_x() + bar.get_width()/2., height + 500,
f'{height:,}\n({percentage:.1f}%)',
ha='center', va='bottom', fontsize=10)

ax.set_title('Ежемесячные продажи относительно цели', fontsize=16)
ax.set_ylabel('Продажи (руб.)', fontsize=14)
plt.show()

Настройка легенд критически важна для многогрупповых диаграмм:

Python
Скопировать код
years = ['2021', '2022', '2023', '2024']
product_a = [12, 17, 22, 28]
product_b = [15, 20, 18, 24]
product_c = [8, 14, 20, 22]

x = np.arange(len(years))
width = 0.25

fig, ax = plt.subplots(figsize=(12, 8))

# Создаем сгруппированную диаграмму
rects1 = ax.bar(x – width, product_a, width, label='Продукт A', color='#4C72B0')
rects2 = ax.bar(x, product_b, width, label='Продукт B', color='#55A868')
rects3 = ax.bar(x + width, product_c, width, label='Продукт C', color='#C44E52')

# Настраиваем легенду
ax.legend(title='Продуктовая линейка', 
loc='upper left',
fontsize=12,
frameon=True,
framealpha=0.8,
shadow=True,
fancybox=True,
borderpad=1)

ax.set_title('Продажи по продуктам и годам', fontsize=16)
ax.set_xticks(x)
ax.set_xticklabels(years)
ax.set_ylabel('Объем продаж (млн $)', fontsize=14)

plt.tight_layout()
plt.show()

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

Python
Скопировать код
import matplotlib.cm as cm
import matplotlib.colors as mcolors

# Создаем данные с большим количеством категорий
categories = [f'Кат. {chr(65+i)}' for i in range(10)]
values = np.random.randint(10, 100, size=len(categories))

fig, ax = plt.subplots(figsize=(14, 8))

# Используем цветовую карту для создания последовательности цветов
cmap = cm.get_cmap('viridis', len(categories))
colors = [cmap(i) for i in range(len(categories))]

# Создаем столбцы с градиентной заливкой
bars = ax.bar(categories, values, color=colors, edgecolor='black', linewidth=1)

# Добавляем значения на столбцы с контрастным цветом текста
for i, bar in enumerate(bars):
height = bar.get_height()
# Определяем контрастный цвет текста (черный или белый)
luminance = mcolors.rgb_to_hsv(cmap(i)[:3])[2] # Извлекаем яркость цвета
text_color = 'black' if luminance > 0.5 else 'white'

ax.text(bar.get_x() + bar.get_width()/2., height * 0.95,
f'{height}',
ha='center', va='top', color=text_color, 
fontweight='bold', fontsize=12)

ax.set_title('Использование цветовой карты для столбчатой диаграммы', fontsize=16)
plt.tight_layout()
plt.show()

При работе с matplotlib доступны различные системы цветового кодирования:

Тип цветовой схемыИспользованиеПримеры в matplotlib
КатегориальныеДля различения дискретных категорийtab10, Set1, Set2, Dark2, Paired
ПоследовательныеДля отображения значений от низких к высокимBlues, Greens, Reds, Purples, YlOrRd
РасходящиесяДля данных с центральной нейтральной точкойRdBu, RdYlGn, Spectral, coolwarm
Перцептивно равномерныеДля точного восприятия различийviridis, plasma, inferno, magma, cividis
ЦиклическиеДля периодических данныхtwilight, hsv, twilight_shifted

Чтобы выбрать оптимальную цветовую схему для вашей диаграммы, учитывайте тип данных, аудиторию и контекст представления. Для людей с нарушениями цветовосприятия рекомендуется использовать схемы, дружественные к дальтоникам, такие как 'viridis' или 'cividis'.

Освоили создание диаграмм с подписями и легендами? Это ценный навык для аналитика данных или разработчика. Не знаете, какая IT-профессия подойдёт именно вам? Пройдите Тест на профориентацию от Skypro, чтобы определить свою идеальную роль в индустрии. Тест анализирует ваши навыки, интересы и личностные качества, чтобы рекомендовать наиболее подходящее направление развития в мире Python-разработки или анализа данных.

Практические кейсы применения

Столбчатые диаграммы широко применяются в различных сферах анализа данных и бизнес-аналитики. Рассмотрим несколько практических примеров использования plot.bar для решения реальных задач. 📈

Сначала разберем пример визуализации результатов A/B тестирования:

Python
Скопировать код
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

# Имитируем данные A/B теста
np.random.seed(42)
control_data = np.random.normal(10, 2, 100) # Контрольная группа
test_data = np.random.normal(10.8, 2, 100) # Тестовая группа (с небольшим улучшением)

# Создаем датафрейм
df = pd.DataFrame({
'Контрольная': control_data,
'Тестовая': test_data
})

# Рассчитываем среднее и доверительные интервалы
mean_control = df['Контрольная'].mean()
mean_test = df['Тестовая'].mean()
ci_control = stats.sem(df['Контрольная']) * stats.t.ppf(0.975, len(df['Контрольная'])-1)
ci_test = stats.sem(df['Тестовая']) * stats.t.ppf(0.975, len(df['Тестовая'])-1)

# Создаем столбчатую диаграмму с планками погрешности
fig, ax = plt.subplots(figsize=(10, 6))
groups = ['Контрольная', 'Тестовая']
means = [mean_control, mean_test]
errors = [ci_control, ci_test]

x_pos = np.arange(len(groups))
bars = ax.bar(x_pos, means, yerr=errors, align='center', 
alpha=0.8, capsize=10, color=['#5DA5DA', '#FAA43A'],
ecolor='black', edgecolor='black')

# Добавляем аннотации
for i, bar in enumerate(bars):
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., height + 0.1,
f'{means[i]:.2f} ± {errors[i]:.2f}',
ha='center', va='bottom', fontsize=10)

# Проводим t-тест для определения статистической значимости
t_stat, p_value = stats.ttest_ind(control_data, test_data)
significance = "Статистически значимо (p<0.05)" if p_value < 0.05 else "Статистически не значимо"

ax.set_title(f'Результаты A/B теста\n{significance} (p={p_value:.4f})', fontsize=14)
ax.set_xticks(x_pos)
ax.set_xticklabels(groups)
ax.set_ylabel('Среднее значение метрики', fontsize=12)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.tight_layout()
plt.show()

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

Python
Скопировать код
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime, timedelta

# Генерируем временной ряд данных
np.random.seed(42)
start_date = datetime(2022, 1, 1)
dates = [start_date + timedelta(days=i) for i in range(365*2)] # 2 года данных
values = np.cumsum(np.random.normal(0, 1, len(dates))) + 100 # Случайное блуждание

# Создаем датафрейм
df = pd.DataFrame({
'Date': dates,
'Value': values
})

# Добавляем колонки с годом и месяцем
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['MonthName'] = df['Date'].dt.strftime('%b')

# Группируем средние значения по месяцам и годам
monthly_avg = df.groupby(['Year', 'Month', 'MonthName'])['Value'].mean().reset_index()

# Настраиваем порядок месяцев
month_order = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
monthly_avg['MonthName'] = pd.Categorical(
monthly_avg['MonthName'], categories=month_order, ordered=True
)
monthly_avg = monthly_avg.sort_values(['Year', 'MonthName'])

# Подготавливаем данные для сгруппированной диаграммы
years = monthly_avg['Year'].unique()
months = month_order

# Создаем фигуру
fig, ax = plt.subplots(figsize=(14, 8))

# Настраиваем позиции для группировки
x = np.arange(len(months))
width = 0.35
multiplier = 0

# Создаем столбцы для каждого года
for year in years:
year_data = monthly_avg[monthly_avg['Year'] == year]
offset = width * multiplier
rects = ax.bar(x + offset, year_data['Value'], width, label=f'{year}',
alpha=0.8 if multiplier == 0 else 0.6)

# Добавляем подписи значений
for i, rect in enumerate(rects):
height = rect.get_height()
if i % 3 == 0: # Подписываем только каждый третий месяц для читаемости
ax.text(rect.get_x() + rect.get_width()/2., height + 1,
f'{height:.1f}',
ha='center', va='bottom', fontsize=8)

multiplier += 1

# Добавляем подписи и легенду
ax.set_title('Среднемесячные значения по годам', fontsize=16)
ax.set_xticks(x + width/2)
ax.set_xticklabels(months, rotation=45)
ax.legend(title='Год', loc='upper left')
ax.set_ylabel('Среднее значение', fontsize=14)

# Добавляем сетку для удобства чтения
ax.yaxis.grid(True, linestyle='--', alpha=0.7)

# Добавляем аннотацию с трендом
for year in years:
year_data = monthly_avg[monthly_avg['Year'] == year]
trend = np.polyfit(range(len(year_data)), year_data['Value'], 1)[0]
trend_direction = "↑" if trend > 0 else "↓"
ax.text(len(months) – 1, 
year_data['Value'].iloc[-1] + 5, 
f'{year}: {trend_direction} {abs(trend):.2f}/месяц',
fontsize=10, color='black' if multiplier == 1 else 'gray',
ha='right')

plt.tight_layout()
plt.show()

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

Python
Скопировать код
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# Создаем данные для опроса удовлетворенности клиентов по разным аспектам сервиса
categories = [
'Скорость обслуживания',
'Качество продукта',
'Соотношение цена/качество',
'Доброжелательность персонала',
'Чистота помещения',
'Удобство использования сайта',
'Оперативность доставки',
'Точность заказа'
]

# Имитируем результаты опроса: процент очень довольных, довольных, нейтральных,
# недовольных и очень недовольных клиентов
responses = {
'Очень доволен': [15, 25, 18, 32, 40, 22, 19, 27],
'Доволен': [45, 40, 35, 38, 35, 30, 42, 45],
'Нейтрально': [25, 20, 30, 20, 15, 25, 25, 18],
'Недоволен': [10, 10, 12, 8, 7, 15, 10, 7],
'Очень недоволен': [5, 5, 5, 2, 3, 8, 4, 3]
}

# Цветовая схема для разных уровней удовлетворенности
colors = ['#2ca02c', '#98df8a', '#d3d3d3', '#ff9896', '#d62728']

# Создаем датафрейм
df = pd.DataFrame(responses, index=categories)

# Создаем горизонтальную 100% штабелированную диаграмму
fig, ax = plt.subplots(figsize=(12, 10))

# Конвертируем значения в проценты
df_percent = df.div(df.sum(axis=1), axis=0) * 100

# Начальная позиция для первой категории
y_pos = np.arange(len(categories))
left = np.zeros(len(categories)) # Начальная позиция по оси X

# Добавляем столбцы для каждого уровня удовлетворенности
for i, (colname, color) in enumerate(zip(df.columns, colors)):
ax.barh(y_pos, df_percent[colname], left=left, color=color, label=colname, edgecolor='white', height=0.7)

# Добавляем подписи с процентами внутри столбцов
for j, (p, value) in enumerate(zip(df_percent[colname], df[colname])):
# Отображаем проценты только если они больше 5%
if p > 5:
text_x = left[j] + p/2
ax.text(text_x, y_pos[j], f'{int(p)}%\n({value})', ha='center', va='center', fontsize=10, fontweight='bold')

left += df_percent[colname] # Обновляем начальную позицию для следующей категории

# Настраиваем ось Y в обратном порядке, чтобы первая категория была вверху
ax.set_yticks(y_pos)
ax.set_yticklabels(categories)
ax.invert_yaxis()

# Удаляем ненужные границы и добавляем сетку
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.xaxis.set_visible(False) # Скрываем ось X, так как у нас проценты внутри

# Добавляем легенду и заголовок
ax.legend(title='Уровень удовлетворенности', bbox_to_anchor=(0.5, -0.05), 
loc='upper center', ncol=5, frameon=False)
ax.set_title('Распределение удовлетворенности клиентов по аспектам сервиса', fontsize=16, pad=20)

plt.tight_layout()
plt.show()

Использование matplotlib.pyplot.bar() позволяет визуализировать самые разные типы данных в зависимости от поставленных задач. От простых сравнительных диаграмм до сложных многоуровневых визуализаций — этот инструмент предоставляет гибкие возможности для эффективного представления данных.

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