Визуализация данных на Python: 10 лучших примеров с кодом

10 лучших примеров визуализации данных на Python с готовым кодом: Matplotlib, Seaborn и Plotly. Линейные графики, heatmap, pairplot, анимация и карты.

Визуализация данных на Python — один из самых быстрых способов понять, что происходит в данных. Один удачный график заменяет десятки строк df.describe(): сразу видны тренды, выбросы, корреляции и аномалии.

В этой статье собраны 10 лучших примеров визуализации данных на Python с готовым кодом на Matplotlib, Seaborn и Plotly. Все примеры используют открытые учебные датасеты, поэтому их можно запустить в Jupyter Notebook или Google Colab без подготовки данных.

Содержание

Визуализация данных на Python: что понадобится

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

pip install matplotlib seaborn plotly pandas numpy

Во всех примерах ниже используются стандартные импорты:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px

sns.set_theme(style="whitegrid") # аккуратный стиль для всех графиков

tips = sns.load_dataset("tips") # чаевые в ресторане
penguins = sns.load_dataset("penguins").dropna() # пингвины Палмера
flights = sns.load_dataset("flights") # пассажиропоток 1949–1960
gapminder = px.data.gapminder() # страны мира: ВВП, население

1. Линейный график временного ряда (Matplotlib)

Линейный график — классика для временных рядов: продажи по месяцам, курс валют, нагрузка на сервер. Matplotlib даёт полный контроль над каждым элементом.

yearly = flights.groupby("year")["passengers"].sum()

fig, ax = plt.subplots(figsize=(10, 5))
ax.plot(yearly.index, yearly.values, marker="o", linewidth=2.5, color="#2563eb")
ax.fill_between(yearly.index, yearly.values, alpha=0.15, color="#2563eb")

# подпись последнего значения
ax.annotate(f"{yearly.iloc[-1]:,}", xy=(yearly.index[-1], yearly.iloc[-1]),
xytext=(-40, 10), textcoords="offset points", fontweight="bold")

ax.set_title("Пассажиропоток авиакомпаний по годам", fontsize=14)
ax.set_xlabel("Год")
ax.set_ylabel("Пассажиры, тыс.")
plt.tight_layout()
plt.show()

Когда использовать: динамика показателя во времени. Заливка под линией через fill_between и подпись последней точки делают график читаемым даже без легенды.

2. Столбчатая диаграмма с группировкой (Seaborn)

Столбчатая диаграмма сравнивает значения между категориями. Seaborn сам посчитает среднее и нарисует планки разброса.

plt.figure(figsize=(9, 5))
ax = sns.barplot(data=tips, x="day", y="total_bill", hue="sex",
errorbar="sd", palette="Set2")
ax.set_title("Средний чек по дням недели")
ax.set_xlabel("День")
ax.set_ylabel("Сумма счёта, $")
for container in ax.containers:
ax.bar_label(container, fmt="%.1f", padding=3, fontsize=9)
plt.tight_layout()
plt.show()

Параметр hue добавляет вторую категорию, а bar_label выводит значения прямо на столбцах — читателю не придётся гадать по оси.

3. Гистограмма и KDE-распределение

Гистограмма показывает, как распределены значения: есть ли смещение, несколько пиков, длинный хвост. Кривая плотности (KDE) сглаживает картину.

plt.figure(figsize=(10, 5))
sns.histplot(data=penguins, x="flipper_length_mm", hue="species",
kde=True, element="step", bins=30)
plt.title("Распределение длины плавника по видам пингвинов")
plt.xlabel("Длина плавника, мм")
plt.tight_layout()
plt.show()

Режим element="step" рисует контуры вместо залитых столбцов, поэтому перекрывающиеся распределения не сливаются в одно пятно.

4. Диаграмма рассеяния с цветом и размером точек

Scatter plot — главный инструмент поиска связей между двумя числовыми переменными. Цвет и размер точек позволяют уместить на одном графике четыре измерения.

plt.figure(figsize=(10, 6))
sns.scatterplot(data=penguins, x="bill_length_mm", y="bill_depth_mm",
hue="species", size="body_mass_g", sizes=(20, 250),
alpha=0.7, palette="deep")
plt.title("Длина и глубина клюва пингвинов")
plt.xlabel("Длина клюва, мм")
plt.ylabel("Глубина клюва, мм")
plt.legend(bbox_to_anchor=(1.02, 1), loc="upper left")
plt.tight_layout()
plt.show()

Хороший пример парадокса Симпсона: по всем данным связь отрицательная, а внутри каждого вида — положительная. Без цвета по hue этого не увидеть.

5. Тепловая карта корреляций (heatmap)

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

corr = penguins.select_dtypes("number").corr()
mask = np.triu(np.ones_like(corr, dtype=bool)) # прячем верхний треугольник

plt.figure(figsize=(7, 6))
sns.heatmap(corr, mask=mask, annot=True, fmt=".2f",
cmap="coolwarm", vmin=-1, vmax=1, square=True,
linewidths=0.5, cbar_kws={"shrink": 0.8})
plt.title("Матрица корреляций признаков")
plt.tight_layout()
plt.show()

Маска убирает дублирующуюся половину матрицы, а фиксированный диапазон vmin=-1, vmax=1 делает цвета сопоставимыми между разными датасетами.

6. Violin plot и boxplot для сравнения групп

Boxplot показывает медиану, квартили и выбросы, а violin plot добавляет форму распределения. Комбинация идеальна для сравнения групп.

plt.figure(figsize=(10, 5))
sns.violinplot(data=tips, x="day", y="total_bill", hue="smoker",
split=True, inner="quart", palette="muted")
plt.title("Распределение суммы счёта: курящие и некурящие")
plt.xlabel("День")
plt.ylabel("Сумма счёта, $")
plt.tight_layout()
plt.show()

С split=True две группы рисуются половинками одной «скрипки» — сравнивать их намного проще, чем два отдельных графика.

7. Pairplot — все зависимости на одном экране

Pairplot строит матрицу графиков для каждой пары признаков. Это самый быстрый разведочный анализ данных (EDA) в одну строку.

g = sns.pairplot(penguins, hue="species", corner=True,
diag_kind="kde", plot_kws={"alpha": 0.6, "s": 30})
g.figure.suptitle("Попарные зависимости признаков пингвинов", y=1.02)
plt.show()

Параметр corner=True убирает зеркальные графики над диагональью, и картинка становится вдвое компактнее.

8. Анимированный интерактивный график (Plotly)

Знаменитый «пузырьковый» график Ханса Рослинга: как менялись доход и продолжительность жизни в странах мира с 1952 по 2007 год. В Plotly Express это одна функция.

fig = px.scatter(
gapminder, x="gdpPercap", y="lifeExp",
animation_frame="year", animation_group="country",
size="pop", color="continent", hover_name="country",
log_x=True, size_max=55,
range_x=[100, 100_000], range_y=[25, 90],
labels={"gdpPercap": "ВВП на душу, $", "lifeExp": "Продолжительность жизни"},
title="Доход и продолжительность жизни, 1952–2007",
)
fig.show()
# fig.write_html("gapminder.html") # сохранить как интерактивную страницу

График поддерживает зум, подсказки при наведении и кнопку воспроизведения. Через write_html его можно встроить на сайт или отправить коллегам без Python.

9. Карта мира: choropleth в Plotly

Географические данные лучше всего показывать на карте. Choropleth раскрашивает страны по значению показателя.

df_2007 = gapminder.query("year == 2007")

fig = px.choropleth(
df_2007, locations="iso_alpha", color="lifeExp",
hover_name="country", color_continuous_scale="Viridis",
projection="natural earth",
labels={"lifeExp": "Лет"},
title="Ожидаемая продолжительность жизни, 2007",
)
fig.update_layout(margin=dict(l=0, r=0, t=50, b=0))
fig.show()

Для карт нужны ISO-коды стран (iso_alpha). Шкала Viridis одинаково хорошо читается при дальтонизме и в чёрно-белой печати.

10. Мини-дашборд из нескольких графиков

Когда нужно показать данные целиком — в отчёте или презентации — удобно собрать несколько графиков в одну фигуру через plt.subplots.

fig, axes = plt.subplots(2, 2, figsize=(13, 9))
fig.suptitle("Анализ чаевых в ресторане", fontsize=16, fontweight="bold")

sns.histplot(data=tips, x="total_bill", kde=True, ax=axes[0, 0], color="#6366f1")
axes[0, 0].set_title("Распределение суммы счёта")

sns.boxplot(data=tips, x="day", y="tip", ax=axes[0, 1], palette="pastel")
axes[0, 1].set_title("Чаевые по дням")

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time", ax=axes[1, 0])
axes[1, 0].set_title("Счёт и чаевые")

tips["day"].value_counts().plot.pie(autopct="%1.0f%%", ax=axes[1, 1],
startangle=90, ylabel="")
axes[1, 1].set_title("Доля визитов по дням")

plt.tight_layout()
plt.savefig("dashboard.png", dpi=200, bbox_inches="tight")
plt.show()

Параметр ax= есть у всех функций Seaborn и pandas-графиков, поэтому любой из них можно поместить в нужную ячейку сетки. savefig с dpi=200 даёт чёткую картинку для отчёта.

Какую библиотеку выбрать для визуализации данных

БиблиотекаСильные стороныКогда использовать
MatplotlibПолный контроль, публикационное качествоОтчёты, статьи, тонкая настройка
SeabornСтатистические графики в одну строку, красивые стилиEDA, анализ распределений и связей
PlotlyИнтерактивность, анимация, картыДашборды, веб, презентации
Bokeh / AltairИнтерактив в браузере, декларативный стильВеб-приложения, Jupyter

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

Советы по визуализации данных

  • Один график — одна мысль. Заголовок должен формулировать вывод, а не просто название осей.
  • Подписывайте оси и единицы измерения.
  • Не используйте круговые диаграммы для 6+ категорий — столбцы читаются лучше.
  • Выбирайте палитры, доступные при дальтонизме: viridis, cividis, colorblind.
  • Для больших датасетов используйте alpha или sns.kdeplot, чтобы точки не сливались.

FAQ

Какая библиотека лучше для визуализации данных на Python?

Универсального ответа нет. Для новичков удобнее всего Seaborn, для полного контроля — Matplotlib, для интерактивных графиков и дашбордов — Plotly.

Как сохранить график в файл?

В Matplotlib и Seaborn — plt.savefig("chart.png", dpi=200). В Plotly — fig.write_html("chart.html") или fig.write_image("chart.png") (нужен пакет kaleido).

Почему в графике не отображается кириллица?

Обычно помогает выбрать шрифт с поддержкой кириллицы: plt.rcParams["font.family"] = "DejaVu Sans".

Заключение

Эти 10 примеров покрывают большинство задач визуализации данных на Python: от линейного графика до анимированной карты мира. Скопируйте код, замените датасет на свой — и получите наглядный график за пару минут. Подробнее о возможностях библиотек — в официальных галереях Matplotlib, Seaborn и Plotly.

Больше практических статей и примеров кода по Python и анализу данных — на UPROGER.

Поделиться:

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *