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

Визуализация данных на Python — один из самых быстрых способов понять, что происходит в данных. Один удачный график заменяет десятки строк df.describe(): сразу видны тренды, выбросы, корреляции и аномалии.
В этой статье собраны 10 лучших примеров визуализации данных на Python с готовым кодом на Matplotlib, Seaborn и Plotly. Все примеры используют открытые учебные датасеты, поэтому их можно запустить в Jupyter Notebook или Google Colab без подготовки данных.
Содержание
- 1. Линейный график временного ряда (Matplotlib)
- 2. Столбчатая диаграмма с группировкой (Seaborn)
- 3. Гистограмма и KDE-распределение
- 4. Диаграмма рассеяния с цветом и размером точек
- 5. Тепловая карта корреляций (heatmap)
- 6. Violin plot и boxplot для сравнения групп
- 7. Pairplot — все зависимости на одном экране
- 8. Анимированный интерактивный график (Plotly)
- 9. Карта мира: choropleth в Plotly
- 10. Мини-дашборд из нескольких графиков
- Какую библиотеку выбрать
- FAQ
Визуализация данных на 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.






