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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Подготовка данных для создания 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'
Элемент дизайнаMatplotlibSeaborn
Цветовые схемыplt.cm, ручные списки цветовsns.color_palette(), предустановленные палитры
Стилиplt.style.use()sns.set_style(), sns.set_theme()
Размер и разрешение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-визуализаций, вы получаете возможность не только представлять данные, но и влиять на принятие решений. Помните: наиболее эффективная диаграмма не обязательно самая сложная — она та, которая точно передаёт вашу мысль и заставляет аудиторию действовать на основе полученной информации.