SNS Pie Plot: обзор создания круговых диаграмм с Seaborn

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

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

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

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

    Круговые диаграммы — мощный инструмент визуализации данных, позволяющий одним взглядом оценить пропорции и распределение категориальных переменных. Библиотека Seaborn, известная своими элегантными статистическими графиками, предоставляет эффективные средства для создания информативных pie plots даже начинающим аналитикам. Освоение этой техники визуализации открывает новые горизонты в представлении данных, делая ваши отчеты и презентации не только информативными, но и визуально привлекательными. Разберемся, как превратить таблицы чисел в наглядные круговые диаграммы с помощью Seaborn! 📊✨

Хотите быстро освоить создание круговых диаграмм в Seaborn и другие мощные инструменты визуализации данных? Курс «Аналитик данных» с нуля от Skypro даст вам не только теоретические знания, но и практические навыки работы с Python и его библиотеками. Вы научитесь превращать сложные данные в понятные визуализации и принимать на их основе бизнес-решения. Начните создавать профессиональные графики уже через 2 месяца обучения!

Что такое SNS Pie Plot и зачем он нужен аналитикам

SNS Pie Plot (круговая диаграмма в Seaborn) — это графическое представление категориальных данных, где размер каждого сектора пропорционален величине категории относительно целого. Фактически, Seaborn не имеет встроенной функции для создания круговых диаграмм напрямую, но предлагает элегантный способ использования базовых возможностей Matplotlib с преимуществами Seaborn для стилизации.

Круговые диаграммы особенно полезны, когда необходимо:

  • Показать пропорциональное отношение частей к целому
  • Визуализировать распределение категорий с ограниченным числом сегментов (оптимально 5-7)
  • Наглядно продемонстрировать доли рынка, бюджета или других значений в процентном соотношении
  • Упростить восприятие относительных пропорций для нетехнической аудитории

Александр Петров, руководитель аналитического отдела

Несколько лет назад наша команда представила руководству объемный отчет о клиентской базе компании — десятки таблиц с цифрами и стандартные столбчатые диаграммы. Директор посмотрел материал и сказал: "Мне непонятно, каких клиентских сегментов у нас больше всего и на кого нам стоит нацелить следующую рекламную кампанию".

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

Преимущества использования Seaborn для создания круговых диаграмм в сравнении с базовым Matplotlib:

АспектБазовый MatplotlibSeaborn + Matplotlib
Эстетика по умолчаниюБазовая, требует настройкиСовременная и профессиональная
Цветовые схемыОграниченный выборРасширенные палитры, адаптированные к типам данных
Интеграция с DataFrameТребует дополнительной обработкиПрямая поддержка pandas DataFrame
СтилизацияМногословнаяМинималистичная и интуитивная
Времязатраты на созданиеВышеНиже

Важно понимать, что напрямую функции pie() в Seaborn нет — вместо этого мы используем интеграцию с Matplotlib, одновременно применяя преимущества Seaborn в стилизации и управлении цветовыми темами. Это позволяет создавать профессионально выглядящие круговые диаграммы с минимальными усилиями. 🎨

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

Подготовка данных для создания круговых диаграмм

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

Идеальный формат данных для круговых диаграмм:

  • Категориальные переменные (названия сегментов) и соответствующие им численные значения (размеры)
  • Данные должны быть агрегированы — одно значение на категорию
  • Количество категорий не должно превышать 7-8 для сохранения читаемости
  • Сумма всех значений должна представлять логическое целое (100%)

Импортируем необходимые библиотеки и подготовим пример данных:

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

# Создаем простой DataFrame с данными для круговой диаграммы
data = pd.DataFrame({
'категория': ['Кошки', 'Собаки', 'Рыбки', 'Птицы', 'Грызуны'],
'продажи': [384, 245, 178, 156, 102]
})

# Проверяем наши данные
print(data)

Часто данные необходимо агрегировать или трансформировать перед визуализацией. Рассмотрим типичные методы подготовки данных:

Python
Скопировать код
# Из сырых данных о продажах
raw_sales = pd.DataFrame({
'дата': pd.date_range(start='2025-01-01', periods=100),
'товар': np.random.choice(['Кошки', 'Собаки', 'Рыбки', 'Птицы', 'Грызуны'], 100),
'сумма': np.random.randint(100, 1000, 100)
})

# Агрегируем данные для круговой диаграммы
aggregated_data = raw_sales.groupby('товар')['сумма'].sum().reset_index()
aggregated_data.columns = ['категория', 'продажи']

# Для наглядности можно добавить расчет процентов
aggregated_data['процент'] = round(aggregated_data['продажи'] / aggregated_data['продажи'].sum() * 100, 1)

print(aggregated_data)

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

Проблема данныхРешениеПример в коде
Слишком много категорийОбъединить мелкие категории в "Прочее"Группировка категорий с долей < 5%
Сильный разброс значенийЛогарифмирование или группировкаПрименение np.log() или создание бакетов
Отрицательные значенияИспользовать абсолютные значения или другой тип графикаПрименение np.abs() или выбор альтернативы
Пропущенные данныеУдаление или замена средними значениямиdropna() или fillna()
Несбалансированные данныеНормализация или процентное представлениеРасчет долей относительно суммы

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

Python
Скопировать код
# Объединение мелких категорий
threshold = 0.05 # порог в 5%
total = aggregated_data['продажи'].sum()

# Помечаем категории с долей меньше порога
aggregated_data['группа'] = aggregated_data.apply(
lambda x: 'Прочее' if x['продажи']/total < threshold else x['категория'], 
axis=1
)

# Группируем заново
final_data = aggregated_data.groupby('группа')['продажи'].sum().reset_index()
final_data.columns = ['категория', 'продажи']

print(final_data)

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

Базовый синтаксис и параметры настройки SNS Pie Plot

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

Основная структура кода для создания круговой диаграммы с использованием Seaborn + Matplotlib:

Python
Скопировать код
# Устанавливаем стиль Seaborn
sns.set_theme(style="whitegrid")

# Создаем фигуру с заданными размерами
plt.figure(figsize=(10, 6))

# Создаем круговую диаграмму с помощью matplotlib
plt.pie(
x=data['продажи'], # значения для сегментов
labels=data['категория'], # метки сегментов
autopct='%1.1f%%', # формат отображения процентов
startangle=90, # угол начала первого сегмента
shadow=True, # тень для объемного эффекта
explode=[0\.05]*len(data) # "выдвижение" сегментов
)

# Добавляем заголовок с использованием стиля Seaborn
plt.title('Распределение продаж по категориям товаров', fontsize=14)

# Равные пропорции для круга
plt.axis('equal')

# Отображаем график
plt.tight_layout()
plt.show()

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

  • x – числовые данные для построения сегментов диаграммы
  • labels – метки для каждого сегмента
  • colors – цвета для сегментов (можно использовать палитры Seaborn)
  • autopct – формат отображения процентов внутри сегментов
  • startangle – угол начала первого сегмента (90 для начала сверху)
  • explode – массив значений, определяющий "выдвижение" сегментов
  • shadow – добавление тени для объемного эффекта
  • wedgeprops – свойства секторов (граница, ширина линий и т.д.)
  • textprops – свойства текста (размер, цвет, шрифт)

Интеграция с цветовыми палитрами Seaborn:

Python
Скопировать код
# Получаем цветовую палитру из Seaborn
colors = sns.color_palette("Set3", len(data))

# Используем палитру в круговой диаграмме
plt.figure(figsize=(10, 6))
plt.pie(
data['продажи'], 
labels=data['категория'], 
colors=colors,
autopct='%1.1f%%', 
startangle=90
)
plt.axis('equal')
plt.show()

Популярные цветовые палитры Seaborn для круговых диаграмм:

  • "Set1", "Set2", "Set3" – качественные палитры для категориальных данных
  • "pastel" – пастельные цвета для более мягкого визуального эффекта
  • "muted" – приглушенные цвета для профессиональных презентаций
  • "husl" – равномерно распределенные оттенки для максимального контраста
  • "paired" – парные цвета, хорошо подходят для сравнения категорий

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

Python
Скопировать код
plt.figure(figsize=(12, 8))

# Добавляем информацию о доходах в легенду
patches, texts, autotexts = plt.pie(
data['продажи'], 
labels=data['категория'],
autopct='%1.1f%%',
explode=[0\.05, 0, 0, 0, 0], # Выделяем первый сегмент
shadow=True,
colors=sns.color_palette("pastel", len(data))
)

# Улучшаем читаемость текста
plt.setp(autotexts, size=10, weight="bold")

# Добавляем легенду с абсолютными значениями
plt.legend(
title="Категории товаров",
loc="center left",
bbox_to_anchor=(1, 0, 0.5, 1),
labels=[f"{cat}: {val} ед." for cat, val in zip(data['категория'], data['продажи'])]
)

plt.title('Распределение продаж по категориям товаров (2025)', fontsize=16)
plt.axis('equal')
plt.tight_layout()
plt.show()

Использование кольцевой диаграммы (doughnut chart) — популярной альтернативы базовому pie chart:

Python
Скопировать код
# Создаем кольцевую диаграмму
plt.figure(figsize=(10, 6))
plt.pie(
data['продажи'], 
labels=data['категория'],
autopct='%1.1f%%',
colors=sns.color_palette("viridis", len(data)),
startangle=90,
wedgeprops=dict(width=0.5) # Этот параметр создает "дырку" в центре
)
plt.axis('equal')
plt.title('Распределение продаж (кольцевая диаграмма)', fontsize=14)
plt.show()

Базовый синтаксис Seaborn Pie Plot предлагает широкие возможности для визуализации категориальных данных. Правильное использование параметров позволяет создавать информативные и эстетически привлекательные круговые диаграммы, точно передающие соотношения категорий в ваших данных. 📊

Стилизация и кастомизация круговых диаграмм в Seaborn

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

Марина Соколова, специалист по данным в ритейле

Работая над квартальным отчетом для совета директоров, я столкнулась с проблемой — данные по продажам по категориям выглядели слишком "сухо" в стандартных диаграммах. Клиенты нашей розничной сети делились на премиум, средний и эконом сегменты, и руководству было важно видеть не только пропорции, но и относительную ценность каждого сегмента.

Я решила использовать кастомизированную круговую диаграмму в Seaborn. Применила фирменные цвета компании к сегментам, добавила градиентную заливку для премиум-категории, использовала эффект "выдвижения" для акцентирования самого прибыльного сегмента и включила дополнительную информацию о среднем чеке в аннотациях. Реакция была моментальной — СЕО впервые четко увидел, что хотя премиум-сегмент составлял всего 15% клиентов, он приносил 42% выручки. Эта визуализация привела к пересмотру маркетинговой стратегии и перераспределению бюджетов в пользу привлечения премиум-клиентов.

Настройка общего стиля и темы с использованием Seaborn:

Python
Скопировать код
# Устанавливаем общий стиль для всех графиков
sns.set_theme(style="whitegrid", palette="pastel", font="Arial", font_scale=1.2)

# Расширенная настройка контекста
sns.set_context("paper", rc={"font.size":12, "axes.titlesize":14, "axes.labelsize":12})

# Создаем фигуру с определенными размерами
plt.figure(figsize=(12, 8), dpi=100)

Продвинутая настройка внешнего вида сегментов:

Python
Скопировать код
# Настраиваем внешний вид сегментов
wedges, texts, autotexts = plt.pie(
data['продажи'],
labels=None, # Уберем стандартные метки для кастомного размещения
autopct=lambda pct: f"{pct:.1f}%" if pct > 5 else "", # Показываем проценты только для крупных сегментов
startangle=90,
explode=[0\.1, 0.05, 0, 0, 0], # Выделяем некоторые сегменты
shadow=True,
colors=sns.color_palette("viridis", len(data)),
wedgeprops={
'linewidth': 1,
'edgecolor': 'white',
'alpha': 0.8
},
textprops={'fontsize': 12, 'color': 'black', 'weight': 'bold'}
)

# Изменяем цвет и размер процентов
for autotext in autotexts:
autotext.set_color('white')
autotext.set_fontsize(10)

Добавление элементов дизайна и аннотаций:

Python
Скопировать код
# Добавляем круг в центр для создания кольцевой диаграммы
centre_circle = plt.Circle((0, 0), 0.5, fc='white')
plt.gca().add_patch(centre_circle)

# Добавляем текст в центр
plt.text(0, 0, 'ВСЕГО\n1065\nпродаж', 
horizontalalignment='center',
verticalalignment='center', 
fontsize=14, 
fontweight='bold')

# Создаем кастомную легенду с дополнительной информацией
legend_labels = [f"{cat}\n{val} ед. ({val/sum(data['продажи'])*100:.1f}%)" 
for cat, val in zip(data['категория'], data['продажи'])]
plt.legend(
wedges, 
legend_labels,
title="Категории товаров с объемом продаж",
loc="center left",
bbox_to_anchor=(1, 0, 0.5, 1),
frameon=True,
fancybox=True,
shadow=True
)

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

Python
Скопировать код
# Создаём данные для сравнения двух периодов
data_2024 = pd.DataFrame({
'категория': ['Кошки', 'Собаки', 'Рыбки', 'Птицы', 'Грызуны'],
'продажи': [350, 220, 160, 140, 95]
})

data_2025 = pd.DataFrame({
'категория': ['Кошки', 'Собаки', 'Рыбки', 'Птицы', 'Грызуны'],
'продажи': [384, 245, 178, 156, 102]
})

# Создаем подграфики для сравнения
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(18, 8))

# Первая диаграмма (2024 год)
ax1.pie(
data_2024['продажи'],
labels=data_2024['категория'],
autopct='%1.1f%%',
startangle=90,
colors=sns.color_palette("light:#5A9", len(data_2024))
)
ax1.set_title('Продажи 2024', fontsize=14)
ax1.axis('equal')

# Вторая диаграмма (2025 год)
ax2.pie(
data_2025['продажи'],
labels=data_2025['категория'],
autopct='%1.1f%%',
startangle=90,
colors=sns.color_palette("light:#5A9", len(data_2025))
)
ax2.set_title('Продажи 2025', fontsize=14)
ax2.axis('equal')

plt.suptitle('Сравнение продаж по категориям: 2024 vs 2025', fontsize=16, y=1.05)
plt.tight_layout()

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

Техника стилизацииПрименениеКогда использовать
Градиент заливкиДобавление визуальной глубиныДля выделения наиболее значимых сегментов
Пунктирные границыУтонченное разделение сегментовФормальные презентации, деловой стиль
Вложенные диаграммыПредставление иерархических данныхПри наличии подкатегорий внутри основных
Выноски (аннотации)Дополнительная контекстная информацияКогда нужно объяснить особенности данных
3D-эффектыПодчеркивание объемности данныхДля презентаций, требующих визуального акцента

Улучшение читаемости при большом количестве малых сегментов:

Python
Скопировать код
# Для больших наборов данных настраиваем пороговое значение отображения
threshold = 5 # показываем метки только для сегментов > 5%

# Подготовка данных с учетом порога
large_segments = data[data['продажи']/data['продажи'].sum()*100 > threshold]
small_segments = data[data['продажи']/data['продажи'].sum()*100 <= threshold]

# Если есть малые сегменты, объединяем их в "Прочее"
if not small_segments.empty:
other_row = pd.DataFrame({
'категория': ['Прочее'],
'продажи': [small_segments['продажи'].sum()]
})
plot_data = pd.concat([large_segments, other_row], ignore_index=True)
else:
plot_data = large_segments

# Создаем круговую диаграмму с улучшенной читаемостью
plt.figure(figsize=(12, 8))
wedges, texts, autotexts = plt.pie(
plot_data['продажи'],
labels=plot_data['категория'],
autopct='%1.1f%%',
startangle=90,
colors=sns.color_palette("tab10", len(plot_data)),
wedgeprops={'linewidth': 1, 'edgecolor': 'white'}
)

# Улучшаем отображение меток
for i, text in enumerate(texts):
text.set_fontsize(12)

for i, autotext in enumerate(autotexts):
autotext.set_fontsize(10)
autotext.set_color('white')
autotext.set_weight('bold')

plt.title('Распределение продаж по категориям', fontsize=16)
plt.axis('equal')
plt.tight_layout()

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

Разрабатываете сложные данные для визуализации или просто хотите улучшить свои навыки в создании профессиональных графиков? Тест на профориентацию от Skypro поможет вам определить, насколько ваши навыки и предпочтения соответствуют профессии аналитика данных! Получите персональные рекомендации по развитию карьеры и узнайте, какие навыки визуализации данных стоит освоить именно вам для профессионального роста. Тест займет всего 5 минут, но может изменить ваше будущее!

Практические кейсы использования SNS Pie Plot

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

Кейс 1: Анализ рыночной доли компаний

Python
Скопировать код
# Данные о доле рынка компаний в отрасли электронной коммерции
market_data = pd.DataFrame({
'компания': ['Компания А', 'Компания Б', 'Компания В', 'Компания Г', 'Прочие'],
'доля': [32\.5, 28.7, 15.3, 12.1, 11.4]
})

# Создаем информативную круговую диаграмму
plt.figure(figsize=(12, 8))
colors = sns.color_palette("Blues_d", len(market_data))
explode = [0\.1, 0.05, 0, 0, 0] # Выделяем лидеров рынка

wedges, texts, autotexts = plt.pie(
market_data['доля'],
labels=market_data['компания'],
autopct='%1.1f%%',
startangle=90,
explode=explode,
colors=colors,
shadow=True,
wedgeprops={'edgecolor': 'white', 'linewidth': 1.5}
)

for text in texts:
text.set_fontsize(12)
for autotext in autotexts:
autotext.set_color('white')
autotext.set_fontweight('bold')

plt.title('Доли рынка в сегменте электронной коммерции (2025)', fontsize=16)
plt.axis('equal')

# Добавляем информацию о динамике рынка
plt.annotate(
'Рост рынка: +8.5% к 2024',
xy=(1, 0),
xytext=(1.3, 0),
fontsize=10,
bbox=dict(boxstyle="round,pad=0.3", fc="yellow", alpha=0.2)
)

plt.tight_layout()
plt.show()

Кейс 2: Визуализация структуры расходов компании

Python
Скопировать код
# Данные о структуре расходов компании
expenses = pd.DataFrame({
'категория': ['Зарплаты', 'Аренда', 'Маркетинг', 'IT-инфраструктура', 'Исследования', 'Прочее'],
'сумма': [425000, 180000, 150000, 120000, 85000, 40000]
})

# Вычисляем процентное соотношение
expenses['процент'] = expenses['сумма'] / expenses['сумма'].sum() * 100

# Создаем комбинированную визуализацию
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(18, 8))

# Круговая диаграмма расходов
wedges, texts, autotexts = ax1.pie(
expenses['сумма'],
labels=None,
autopct='%1.1f%%',
startangle=90,
colors=sns.color_palette("rocket", len(expenses)),
wedgeprops={'linewidth': 1, 'edgecolor': 'white', 'alpha': 0.7}
)

# Настраиваем проценты
for autotext in autotexts:
autotext.set_color('white')
autotext.set_fontsize(10)
autotext.set_fontweight('bold')

ax1.set_title('Структура расходов компании', fontsize=14)
ax1.axis('equal')

# Добавляем легенду со значениями
legend_labels = [f"{cat} – ${sum:,}" for cat, sum in zip(expenses['категория'], expenses['сумма'])]
ax1.legend(wedges, legend_labels, loc="center left", bbox_to_anchor=(1, 0, 0.5, 1))

# На втором графике показываем столбчатую диаграмму для сравнения
sns.barplot(x='сумма', y='категория', data=expenses.sort_values('сумма', ascending=False), 
palette="rocket", ax=ax2)
ax2.set_title('Ранжирование расходов по категориям', fontsize=14)
ax2.set_xlabel('Сумма расходов ($)')
ax2.set_ylabel('')

for i, v in enumerate(expenses.sort_values('сумма', ascending=False)['сумма']):
ax2.text(v + 10000, i, f"${v:,}", va='center')

plt.suptitle('Анализ структуры расходов компании за Q1 2025', fontsize=16, y=1.05)
plt.tight_layout()
plt.show()

Кейс 3: Анализ экологического воздействия

Python
Скопировать код
# Данные о структуре углеродного следа компании
carbon_data = pd.DataFrame({
'источник': ['Транспорт', 'Электроэнергия', 'Отопление', 'Производственные процессы', 'Отходы'],
'выбросы_тонн': [1250, 850, 620, 480, 130]
})

# Создаем кольцевую диаграмму с анализом выбросов
plt.figure(figsize=(12, 8))
colors = sns.color_palette("YlGn", len(carbon_data))

# Разворачиваем цветовую палитру для логического соответствия (темнее = больше выбросов)
colors = colors[::-1]

wedges, texts, autotexts = plt.pie(
carbon_data['выбросы_тонн'],
labels=carbon_data['источник'],
autopct=lambda pct: f"{pct:.1f}%\n({int(pct*sum(carbon_data['выбросы_тонн'])/100)} т)",
startangle=90,
colors=colors,
wedgeprops={'linewidth': 1, 'edgecolor': 'white', 'width': 0.6} # width создает кольцевую диаграмму
)

# Настраиваем текст
for text in texts:
text.set_fontsize(12)
for autotext in autotexts:
autotext.set_color('black')
autotext.set_fontsize(10)

# Добавляем текст в центре
plt.annotate(
f"Всего выбросов:\n{sum(carbon_data['выбросы_тонн']):,} тонн CO₂",
xy=(0, 0),
xytext=(0, 0),
ha='center',
va='center',
fontsize=14,
fontweight='bold'
)

plt.title('Структура углеродного следа компании (2025)', fontsize=16)
plt.axis('equal')

# Добавляем сноску с целевыми показателями
plt.annotate(
'Цель по сокращению: -15% к 2026',
xy=(1, -1),
xytext=(1, -1.1),
fontsize=10,
bbox=dict(boxstyle="round,pad=0.3", fc="lightgreen", alpha=0.2)
)

plt.tight_layout()
plt.show()

Кейс 4: Сравнительный анализ источников трафика

Python
Скопировать код
# Данные о источниках трафика за два периода
traffic_2024 = pd.DataFrame({
'источник': ['Поисковые системы', 'Прямые переходы', 'Социальные сети', 'Email-маркетинг', 'Реферальные ссылки'],
'посещения': [45000, 28000, 15000, 8000, 4000]
})

traffic_2025 = pd.DataFrame({
'источник': ['Поисковые системы', 'Прямые переходы', 'Социальные сети', 'Email-маркетинг', 'Реферальные ссылки'],
'посещения': [42000, 25000, 22000, 12000, 9000]
})

# Создаем сравнительную визуализацию с цветовой кодировкой изменений
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(18, 8))

# Функция для определения цвета на основе изменения
def get_color_mapper(old_data, new_data):
changes = {}
for i, source in enumerate(old_data['источник']):
old_val = old_data.loc[old_data['источник'] == source, 'посещения'].values[0]
new_val = new_data.loc[new_data['источник'] == source, 'посещения'].values[0]
changes[source] = (new_val – old_val) / old_val * 100

# Создаем цветовую палитру: красный (падение) -> желтый (нейтрально) -> зеленый (рост)
colors = {}
for source, change in changes.items():
if change > 10: # Существенный рост
colors[source] = 'green'
elif change > 0: # Умеренный рост
colors[source] = 'lightgreen'
elif change > -10: # Небольшое падение
colors[source] = 'yellow'
else: # Существенное падение
colors[source] = 'red'

return [colors[source] for source in old_data['источник']]

# Диаграмма 2024
ax1.pie(
traffic_2024['посещения'],
labels=traffic_2024['источник'],
autopct='%1.1f%%',
startangle=90,
colors=sns.color_palette("pastel", len(traffic_2024))
)
ax1.set_title('Источники трафика 2024', fontsize=14)
ax1.axis('equal')

# Диаграмма 2025 с цветовой индикацией изменений
custom_colors = get_color_mapper(traffic_2024, traffic_2025)
wedges, texts, autotexts = ax2.pie(
traffic_2025['посещения'],
labels=traffic_2025['источник'],
autopct='%1.1f%%',
startangle=90,
colors=custom_colors
)

# Добавляем аннотации с процентом изменения
for i, (wedge, source) in enumerate(zip(wedges, traffic_2025['источник'])):
old_val = traffic_2024.loc[traffic_2024['источник'] == source, 'посещения'].values[0]
new_val = traffic_2025.loc[traffic_2025['источник'] == source, 'посещения'].values[0]
change = (new_val – old_val) / old_val * 100

# Вычисляем позицию для аннотации
theta = (wedge.theta1 + wedge.theta2) / 2
r = 0.8 # Расстояние от центра
x = r * np.cos(np.deg2rad(theta))
y = r * np.sin(np.deg2rad(theta))

# Определяем стиль в зависимости от направления изменения
style = '↑' if change > 0 else '↓'
color = 'green' if change > 0 else 'red'

# Добавляем аннотацию
ax2.annotate(
f"{style} {abs(change):.1f}%",
xy=(x, y),
xytext=(x*1.2, y*1.2),
fontsize=9,
color=color,
fontweight='bold'
)

ax2.set_title('Источники трафика 2025', fontsize=14)
ax2.axis('equal')

plt.suptitle('Сравнение источников трафика: 2024 vs 2025', fontsize=16, y=1.05)
plt.tight_layout()
plt.show()

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

СценарийТип круговой диаграммыОсобенности реализации
Отображение структуры с небольшим числом крупных категорийКлассическая круговая диаграммаЧеткие метки, контрастные цвета
Сравнение "до/после" или нескольких периодовПарные круговые диаграммыЕдиная цветовая схема, аннотации изменений
Многоуровневые категориальные данныеВложенные круговые диаграммыГрадация цвета для подкатегорий
Акцент на общей сумме и доляхКольцевая диаграммаИнформативный центр с суммарным значением
Отслеживание динамики по сегментамАнимированная круговая диаграммаИспользование FuncAnimation из matplotlib.animation

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

Круговые диаграммы остаются одним из наиболее интуитивно понятных и визуально привлекательных способов представления категориальных данных. Интеграция Seaborn и Matplotlib для создания pie plots открывает широкие возможности визуализации — от базовых диаграмм до сложных многослойных представлений с детальными аннотациями. Помните главное правило успешной визуализации: графики должны рассказывать историю данных, а не просто отображать цифры. Правильно оформленная круговая диаграмма способна превратить массив цифр в инсайт, понятный даже непрофессиональной аудитории, и стать основой для принятия обоснованных решений.