Как создать столбчатую диаграмму в Python: руководство по barplot

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

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

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

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

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

Основы столбчатых диаграмм в Python: что такое barplot

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

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

  • Сравнения значений между различными категориями
  • Отображения частотных распределений
  • Визуализации временных рядов с дискретными временными точками
  • Представления результатов опросов или голосований
  • Сравнения производительности или показателей эффективности

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

Тип диаграммы Описание Типичное применение
Простая Базовые прямоугольные столбцы для одного набора данных Простое сравнение категорий
Группированная Несколько столбцов для каждой категории Сравнение подгрупп внутри категорий
Стековая Сегменты данных размещены друг над другом Отображение составных частей и их суммы
Горизонтальная Столбцы расположены горизонтально Визуализация длинных названий категорий

Марина Петрова, ведущий аналитик данных

Когда я только начинала работать с данными страховой компании, мне нужно было визуализировать количество страховых случаев по разным категориям. Традиционные Excel-таблицы не давали руководству общей картины. Освоив создание barplot в Python, я смогла представить данные так, что тренды стали очевидны с первого взгляда.

"Столбцы разных цветов показали, что автострахование и страхование имущества — наши самые "затратные" категории. После презентации этой визуализации руководство решило пересмотреть стратегию андеррайтинга в этих направлениях, что в итоге сэкономило компании около 15% расходов в следующем квартале. Без грамотно построенной столбчатой диаграммы мы могли бы еще долго не заметить эту закономерность."

Пошаговый план для смены профессии

Подготовка данных для создания barplot в Python

Прежде чем создавать столбчатую диаграмму, необходимо правильно подготовить данные. В Python основным форматом для работы с табличными данными является DataFrame из библиотеки pandas. 🐼

Вот базовые шаги подготовки данных:

  1. Импортирование необходимых библиотек
  2. Загрузка или создание набора данных
  3. Очистка и преобразование данных
  4. Агрегирование (если необходимо)
  5. Подготовка структуры данных для конкретного типа barplot

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

Python
Скопировать код
# Импортируем библиотеки
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Создаём простой набор данных о продажах по категориям
data = {
'категория': ['Электроника', 'Одежда', 'Продукты', 'Книги', 'Мебель'],
'продажи': [15000, 12000, 18000, 5000, 9000]
}

# Создаём DataFrame
df = pd.DataFrame(data)

# Проверяем на пропущенные значения
print(df.isnull().sum())

# Сортируем данные по убыванию для лучшей визуализации
df_sorted = df.sort_values(by='продажи', ascending=False)

print(df_sorted)

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

Тип barplot Структура данных Пример pandas DataFrame
Простой Пары категория-значение df['категория'], df['значение']
Группированный "Длинный" (long) формат с категориальной переменной df['категория'], df['подкатегория'], df['значение']
Стековый "Широкий" (wide) формат или агрегированные данные df с несколькими столбцами значений
С доверительными интервалами Данные с метриками разброса df['категория'], df['среднее'], df['стд_отклонение']

Часто необходимо преобразовать данные из одного формата в другой, например, из "широкого" в "длинный" формат, что можно сделать с помощью метода pd.melt():

Python
Скопировать код
# Пример преобразования из "широкого" в "длинный" формат
wide_data = pd.DataFrame({
'товар': ['Смартфон', 'Ноутбук', 'Планшет'],
'Q1': [100, 50, 30],
'Q2': [120, 45, 35],
'Q3': [90, 60, 40]
})

# Преобразуем в "длинный" формат для группированной диаграммы
long_data = pd.melt(
wide_data, 
id_vars=['товар'],
var_name='квартал',
value_name='продажи'
)

print(long_data)

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

Создание базового barplot с помощью matplotlib и seaborn

Освоив подготовку данных, можно приступать к созданию столбчатых диаграмм с использованием популярных библиотек визуализации в Python. Рассмотрим два основных подхода: с помощью базовой библиотеки matplotlib и высокоуровневой надстройки seaborn.

С помощью matplotlib:

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

# Данные для диаграммы
categories = ['Категория A', 'Категория B', 'Категория C', 'Категория D']
values = [23, 17, 35, 29]

# Создание базовой столбчатой диаграммы
plt.figure(figsize=(10, 6))
plt.bar(categories, values, color='skyblue')

# Добавление заголовка и подписей осей
plt.title('Базовая столбчатая диаграмма с matplotlib', fontsize=15)
plt.xlabel('Категории')
plt.ylabel('Значения')

# Добавление значений над столбцами
for i, v in enumerate(values):
plt.text(i, v + 0.5, str(v), ha='center')

plt.tight_layout()
plt.show()

С помощью seaborn:

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

# Создание DataFrame для seaborn
data = pd.DataFrame({
'категория': ['A', 'B', 'C', 'D'],
'значение': [23, 17, 35, 29]
})

# Создание столбчатой диаграммы с seaborn
plt.figure(figsize=(10, 6))
sns.barplot(x='категория', y='значение', data=data, palette='viridis')

# Настройка заголовка и подписей осей
plt.title('Базовая столбчатая диаграмма с seaborn', fontsize=15)
plt.xlabel('Категории')
plt.ylabel('Значения')

plt.tight_layout()
plt.show()

Алексей Смирнов, преподаватель программирования

На одном из моих курсов студент-медик хотел визуализировать результаты клинического исследования эффективности трех препаратов. У него была таблица с показателями улучшения состояния пациентов, но он не мог представить эти данные наглядно.

"Я показал ему, как создать группированную столбчатую диаграмму в Python, где каждый препарат был представлен отдельным цветом, а по горизонтальной оси располагались временные точки измерений. За один час мы написали скрипт, который автоматически генерировал диаграмму на основе его Excel-таблицы. Результат он включил в свою диссертацию, а комиссия особо отметила качество его визуализаций. Теперь этот студент использует Python для всех своих исследований, хотя изначально был далек от программирования."

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

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

# Данные для группированной диаграммы
categories = ['Группа 1', 'Группа 2', 'Группа 3', 'Группа 4']
values1 = [20, 25, 30, 35]
values2 = [25, 32, 34, 20]
values3 = [15, 27, 21, 28]

# Настройка позиций для группированных столбцов
x = np.arange(len(categories))
width = 0.25 # ширина столбца

# Создание группированной диаграммы
plt.figure(figsize=(12, 7))
bar1 = plt.bar(x – width, values1, width, label='Серия A', color='#5DA5DA')
bar2 = plt.bar(x, values2, width, label='Серия B', color='#FAA43A')
bar3 = plt.bar(x + width, values3, width, label='Серия C', color='#60BD68')

# Настройка внешнего вида
plt.title('Группированная столбчатая диаграмма', fontsize=16)
plt.xlabel('Категории', fontsize=14)
plt.ylabel('Значения', fontsize=14)
plt.xticks(x, categories)
plt.legend()
plt.grid(axis='y', linestyle='--', alpha=0.7)

plt.tight_layout()
plt.show()

А для создания стековой (накопительной) столбчатой диаграммы:

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

# Данные для стековой диаграммы
categories = ['Кат. A', 'Кат. B', 'Кат. C', 'Кат. D']
values1 = [20, 25, 30, 35]
values2 = [25, 32, 34, 20]
values3 = [15, 27, 21, 28]

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

plt.bar(categories, values1, label='Компонент 1', color='#5DA5DA')
plt.bar(categories, values2, label='Компонент 2', bottom=values1, color='#FAA43A')

# Нужно рассчитать положение для третьего компонента
bottom_values = [values1[i] + values2[i] for i in range(len(values1))]
plt.bar(categories, values3, label='Компонент 3', bottom=bottom_values, color='#60BD68')

plt.title('Стековая столбчатая диаграмма', fontsize=15)
plt.xlabel('Категории')
plt.ylabel('Значения')
plt.legend()

plt.tight_layout()
plt.show()

В seaborn создание группированной диаграммы ещё проще, так как библиотека автоматически обрабатывает категории в "длинном" формате данных:

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

# Данные в длинном формате
data = pd.DataFrame({
'категория': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D'],
'группа': ['X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z', 'X', 'Y', 'Z'],
'значение': [20, 25, 15, 25, 32, 27, 30, 34, 21, 35, 20, 28]
})

# Создание группированной диаграммы с seaborn
plt.figure(figsize=(12, 7))
sns.barplot(x='категория', y='значение', hue='группа', data=data, palette='viridis')

plt.title('Группированная диаграмма с Seaborn', fontsize=16)
plt.xlabel('Категории', fontsize=14)
plt.ylabel('Значения', fontsize=14)
plt.legend(title='Группы')

plt.tight_layout()
plt.show()

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

Настройка внешнего вида Python-диаграммы barplot

Создание базовой столбчатой диаграммы — только первый шаг. Для достижения профессионального вида и максимальной информативности необходимо уметь настраивать внешний вид графика. Вот ключевые аспекты кастомизации barplot: 🎨

Настройка цветовой схемы:

Python
Скопировать код
# Custom colors in matplotlib
colors = ['#3498db', '#e74c3c', '#2ecc71', '#f39c12', '#9b59b6']
plt.bar(categories, values, color=colors)

# Using colormaps
from matplotlib.cm import get_cmap
n_bars = len(categories)
cmap = get_cmap('viridis')
colors = [cmap(i/n_bars) for i in range(n_bars)]
plt.bar(categories, values, color=colors)

# Seaborn palette
sns.barplot(x='категория', y='значение', data=df, palette='Set2')

Добавление заголовков и подписей:

Python
Скопировать код
plt.title('Анализ продаж по категориям за 2025 год', fontsize=16, fontweight='bold')
plt.xlabel('Категория продукта', fontsize=14)
plt.ylabel('Объем продаж (тыс. руб.)', fontsize=14)

# Настройка шрифтов
plt.rcParams.update({'font.family': 'Arial', 'font.size': 12})

# Вращение подписей категорий
plt.xticks(rotation=45, ha='right')

Добавление аннотаций и значений:

Python
Скопировать код
# Добавление значений над столбцами
for i, v in enumerate(values):
plt.text(i, v + 0.5, f'{v:,}', ha='center', fontweight='bold')

# Добавление процентного изменения
percentages = ['+15%', '-8%', '+23%', '+5%', '-3%']
for i, (value, percent) in enumerate(zip(values, percentages)):
plt.text(i, value/2, percent, ha='center', color='white', fontsize=12)

Настройка сетки и осей:

Python
Скопировать код
# Добавление сетки
plt.grid(axis='y', linestyle='--', alpha=0.7)

# Настройка осей
plt.gca().spines['top'].set_visible(False)
plt.gca().spines['right'].set_visible(False)
plt.gca().spines['left'].set_linewidth(0.5)
plt.gca().spines['bottom'].set_linewidth(0.5)

# Установка предела оси Y
plt.ylim(0, max(values) * 1.2)

Добавление легенды и дополнительной информации:

Python
Скопировать код
# Легенда для группированной диаграммы
plt.legend(title='Квартал', loc='upper right', frameon=True, framealpha=0.9)

# Добавление текстовой информации
plt.figtext(0.02, 0.02, 'Источник: Отчет по продажам за 2025 г.', 
ha='left', fontsize=10, style='italic')

Использование тем и стилей:

Python
Скопировать код
# Использование встроенных стилей matplotlib
plt.style.use('ggplot') # Другие варианты: 'seaborn', 'fivethirtyeight', 'dark_background'

# Использование тем seaborn
sns.set_theme(style="whitegrid") # Другие варианты: 'darkgrid', 'ticks'

Элемент дизайна Matplotlib Seaborn
Цветовые схемы plt.cm, ручные списки цветов sns.color_palette(), предустановленные палитры
Стили plt.style.use() sns.setstyle(), sns.settheme()
Размер и разрешение plt.figure(figsize=(w, h), dpi=300) sns.set_context('paper'/'talk'/'poster')
Шрифты plt.rcParams.update() sns.set(font='Arial', font_scale=1.2)

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

Python
Скопировать код
# Горизонтальная диаграмма в matplotlib
plt.barh(categories, values, color=colors)

# Горизонтальная диаграмма в seaborn
sns.barplot(y='категория', x='значение', data=df, orient='h')

# Сортировка данных для улучшения восприятия
df_sorted = df.sort_values('значение')
sns.barplot(y='категория', x='значение', data=df_sorted, orient='h')

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

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

После освоения базовых принципов создания и настройки столбчатых диаграмм, можно перейти к продвинутым техникам, которые раскроют полный потенциал этого инструмента визуализации. Эти методы особенно полезны для data-аналитиков и исследователей, работающих со сложными данными. 🚀

Диаграммы с доверительными интервалами:

Python
Скопировать код
# Данные со средними значениями и стандартными отклонениями
categories = ['A', 'B', 'C', 'D']
means = [25, 32, 34, 20]
std_devs = [3, 5, 2, 4]

# Создание диаграммы с планками погрешностей
plt.figure(figsize=(10, 6))
plt.bar(categories, means, yerr=std_devs, capsize=10, 
color='skyblue', edgecolor='navy', alpha=0.7)

plt.title('Средние значения с доверительными интервалами', fontsize=15)
plt.ylabel('Значение')
plt.grid(axis='y', linestyle='--', alpha=0.3)
plt.show()

# Аналогично в seaborn (автоматически добавляет доверительные интервалы)
sns.barplot(x='категория', y='значение', data=df_with_multiple_values, estimator=np.mean, errorbar=('ci', 95))

Создание 3D-столбчатых диаграмм:

Python
Скопировать код
from mpl_toolkits.mplot3d import Axes3D

# Данные для 3D-диаграммы
x = np.array([0, 1, 2, 3, 4])
y = np.array([0, 1, 2, 3])
z = np.random.rand(len(y), len(x))*15 # Случайные значения

# Создание 3D-сетки
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# Настройки для 3D-диаграммы
xpos, ypos = np.meshgrid(x, y)
xpos = xpos.flatten()
ypos = ypos.flatten()
zpos = np.zeros_like(xpos)
dx = 0.8 * np.ones_like(zpos)
dy = 0.8 * np.ones_like(zpos)
dz = z.flatten()

# Построение 3D-столбцов
ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='skyblue', shade=True, alpha=0.8)

ax.set_title('3D столбчатая диаграмма', fontsize=15)
ax.set_xlabel('X ось')
ax.set_ylabel('Y ось')
ax.set_zlabel('Z ось (значения)')

plt.tight_layout()
plt.show()

Анимированные столбчатые диаграммы:

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

# Данные для анимации
fig, ax = plt.figure(figsize=(10, 6)), plt.axes()
categories = ['A', 'B', 'C', 'D', 'E']
periods = ['Q1', 'Q2', 'Q3', 'Q4']
data = np.random.randint(10, 50, size=(len(periods), len(categories)))

# Функция инициализации анимации
def init():
ax.clear()
return ax.bar(categories, data[0], color=colors)

# Функция обновления для каждого кадра
def update(frame):
ax.clear()
ax.set_ylim(0, 55)
bars = ax.bar(categories, data[frame], color=colors)
ax.set_title(f'Данные за {periods[frame]}', fontsize=15)
ax.set_ylabel('Значения')
return bars

# Создание анимации
ani = animation.FuncAnimation(fig, update, frames=range(len(periods)), 
init_func=init, blit=True, interval=1000)
plt.tight_layout()

# Сохранение анимации в GIF
ani.save('animated_barplot.gif', writer='pillow', fps=1)
plt.show()

Интерактивные столбчатые диаграммы с Plotly:

Python
Скопировать код
import plotly.express as px
import plotly.graph_objects as go

# Создание интерактивного barplot с Plotly Express
fig = px.bar(
df, 
x='категория', 
y='значение',
color='группа', # для группировки по цвету
barmode='group', # 'group' для группировки, 'stack' для стековой диаграммы
title='Интерактивная группированная диаграмма',
hover_data=['доп_информация'], # дополнительная информация при наведении
text='значение' # отображать значения на столбцах
)

fig.update_layout(
xaxis_title='Категории продуктов',
yaxis_title='Объём продаж',
legend_title='Группа товаров',
font=dict(family='Arial', size=12),
hovermode='closest'
)

fig.show()

Комбинированные графики (столбцы + линии):

Python
Скопировать код
# Данные для комбинированного графика
categories = ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн']
bar_values = [10, 15, 13, 17, 20, 25] # столбцы – абсолютные значения
line_values = [50, 65, 70, 75, 80, 85] # линия – процентное соотношение

# Создаём две оси Y
fig, ax1 = plt.subplots(figsize=(12, 6))
ax2 = ax1.twinx()

# Столбчатая диаграмма на первой оси
bars = ax1.bar(categories, bar_values, color='royalblue', alpha=0.7, label='Продажи (млн руб.)')
ax1.set_xlabel('Месяц')
ax1.set_ylabel('Продажи (млн руб.)', color='royalblue')
ax1.tick_params(axis='y', colors='royalblue')

# Линейный график на второй оси
line = ax2.plot(categories, line_values, color='crimson', marker='o', 
linewidth=3, label='Доля рынка (%)')
ax2.set_ylabel('Доля рынка (%)', color='crimson')
ax2.tick_params(axis='y', colors='crimson')

# Добавление значений над столбцами
for i, v in enumerate(bar_values):
ax1.text(i, v + 0.5, str(v), ha='center', va='bottom', color='royalblue', fontweight='bold')

# Добавление значений на линии
for i, v in enumerate(line_values):
ax2.text(i, v + 1, f"{v}%", ha='center', va='bottom', color='crimson')

# Объединение легенд
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax1.legend(lines + lines2, labels + labels2, loc='upper left')

plt.title('Комбинированный график: продажи и доля рынка', fontsize=16)
plt.tight_layout()
plt.show()

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

Python
Скопировать код
# Данные с кластерами
from sklearn.cluster import KMeans

# Предположим, у нас есть DataFrame с данными
# df = pd.DataFrame({'x': [...], 'y': [...], 'category': [...]})

# Применяем кластеризацию KMeans
X = df[['x', 'y']].values
kmeans = KMeans(n_clusters=3, random_state=42).fit(X)
df['cluster'] = kmeans.labels_

# Создаём столбчатую диаграмму с группировкой по кластерам
plt.figure(figsize=(12, 7))
sns.barplot(x='category', y='value', hue='cluster', data=df, palette='viridis')

plt.title('Распределение значений по категориям и кластерам', fontsize=15)
plt.xlabel('Категория')
plt.ylabel('Значение')
plt.legend(title='Кластер')
plt.tight_layout()
plt.show()

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

Создание столбчатых диаграмм в Python — это гораздо больше, чем просто визуализация данных. Это мощный инструмент коммуникации, превращающий сухие цифры в убедительные истории. Овладев техниками от базовых barplot до интерактивных 3D-визуализаций, вы получаете возможность не только представлять данные, но и влиять на принятие решений. Помните: наиболее эффективная диаграмма не обязательно самая сложная — она та, которая точно передаёт вашу мысль и заставляет аудиторию действовать на основе полученной информации.

Загрузка...