Как создать столбчатую диаграмму в Python: руководство по barplot
Пройдите тест, узнайте какой профессии подходите
Для кого эта статья:
- аналитики и программисты
- студенты и начинающие специалисты в области программирования и анализа данных
профессионалы, стремящиеся улучшить навыки визуализации данных
Визуализация данных превратилась из дополнительного навыка в критически важную компетенцию для аналитиков и программистов. Столбчатые диаграммы (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. 🐼
Вот базовые шаги подготовки данных:
- Импортирование необходимых библиотек
- Загрузка или создание набора данных
- Очистка и преобразование данных
- Агрегирование (если необходимо)
- Подготовка структуры данных для конкретного типа barplot
Рассмотрим пример подготовки данных для создания столбчатой диаграммы:
# Импортируем библиотеки
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()
:
# Пример преобразования из "широкого" в "длинный" формат
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:
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:
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 для всех своих исследований, хотя изначально был далек от программирования."
Для создания группированной столбчатой диаграммы с несколькими категориями используйте следующий подход:
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()
А для создания стековой (накопительной) столбчатой диаграммы:
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 создание группированной диаграммы ещё проще, так как библиотека автоматически обрабатывает категории в "длинном" формате данных:
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: 🎨
Настройка цветовой схемы:
# 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')
Добавление заголовков и подписей:
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')
Добавление аннотаций и значений:
# Добавление значений над столбцами
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)
Настройка сетки и осей:
# Добавление сетки
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)
Добавление легенды и дополнительной информации:
# Легенда для группированной диаграммы
plt.legend(title='Квартал', loc='upper right', frameon=True, framealpha=0.9)
# Добавление текстовой информации
plt.figtext(0.02, 0.02, 'Источник: Отчет по продажам за 2025 г.',
ha='left', fontsize=10, style='italic')
Использование тем и стилей:
# Использование встроенных стилей 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.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) |
Для повышения читаемости диаграммы в случае большого количества категорий, рекомендуется использовать горизонтальную ориентацию:
# Горизонтальная диаграмма в 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-аналитиков и исследователей, работающих со сложными данными. 🚀
Диаграммы с доверительными интервалами:
# Данные со средними значениями и стандартными отклонениями
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-столбчатых диаграмм:
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()
Анимированные столбчатые диаграммы:
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:
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()
Комбинированные графики (столбцы + линии):
# Данные для комбинированного графика
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()
Кластеризованные столбчатые диаграммы для анализа групп:
# Данные с кластерами
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-визуализаций, вы получаете возможность не только представлять данные, но и влиять на принятие решений. Помните: наиболее эффективная диаграмма не обязательно самая сложная — она та, которая точно передаёт вашу мысль и заставляет аудиторию действовать на основе полученной информации.