Вступ: стан візуалізації даних у Python
Якщо ви працюєте з даними у 2025–2026 роках, то без візуалізації — нікуди. Чи ви проводите розвідувальний аналіз (EDA), будуєте предиктивні моделі чи збираєте інтерактивний дашборд для бізнесу — вміння ефективно представити дані у графічному вигляді залишається однією з найважливіших навичок для будь-якого спеціаліста з даних.
І тут у Python справи йдуть дуже добре. Чесно кажучи, його екосистема візуалізації — найбільш зріла серед усіх мов програмування. В основі лежать три ключові бібліотеки, і кожна виконує свою роль:
- Matplotlib — фундаментальна бібліотека, на якій побудовано більшість інших інструментів. Дає повний контроль над кожним елементом графіка.
- Seaborn — бібліотека статистичної візуалізації, що спрощує створення складних графіків поверх Matplotlib і при цьому дає красиве оформлення прямо з коробки.
- Plotly — бібліотека для інтерактивної візуалізації з підтримкою наведення, масштабування та анімацій. Ідеальна для веб-застосунків і дашбордів.
У цьому посібнику ми розберемо найновіші версії: Matplotlib 3.10, Seaborn 0.13 та Plotly 6.x. Побачите реальні приклади коду, дізнаєтесь про нові можливості і навчитесь обирати правильний інструмент під конкретне завдання. Усі приклади протестовані й готові до використання у ваших проєктах.
Matplotlib 3.10: що нового у 2025 році
Matplotlib 3.10 побачив світ 13 грудня 2024 року і приніс низку цікавих покращень. Основний фокус — доступність, сучасний вигляд графіків та підготовка до нових можливостей Python. Давайте розберемо все по порядку.
Новий колірний цикл petroff10
Мабуть, найпомітніша новинка Matplotlib 3.10 — колірний цикл petroff10. І це не просто черговий набір кольорів. За ним стоїть серйозна наукова робота, мета якої — створити палітру, що буде і красивою, і доступною для людей із порушеннями кольорового зору.
Колірний цикл petroff10 розробили з використанням двох підходів:
- Моделювання порушень кольорового зору (CVD) — кожну комбінацію кольорів перевіряли на розрізнення при різних типах дальтонізму (протанопія, дейтеранопія, тританопія).
- Машинне навчання на основі краудсорсингових опитувань — зібрали естетичні переваги реальних користувачів через масове опитування, і на їх основі ML-модель обрала оптимальні кольори.
Результат — палітра з 10 кольорів, яка чітко розрізняється навіть для людей із дальтонізмом. Ось як її використати:
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('petroff10')
fig, ax = plt.subplots(figsize=(10, 6))
t = np.linspace(-10, 10, 100)
nb_colors = len(plt.rcParams['axes.prop_cycle'])
shifts = np.linspace(-5, 5, nb_colors)
amplitudes = np.linspace(1, 1.5, nb_colors)
for t0, a in zip(shifts, amplitudes):
y = a / (1 + np.exp(-(t - t0)))
line, = ax.plot(t, y, '-')
idx = np.linspace(0, len(t) - 1, 20, dtype=int)
ax.plot(t[idx], y[idx], 'o', color=line.get_color())
ax.set_xlim(-10, 10)
ax.set_title('Демонстрація колірного циклу petroff10')
plt.show()
Тут ми будуємо набір сигмоїдних кривих, де кожна використовує окремий колір із циклу petroff10. Маркери 'o' додаються для додаткового розрізнення ліній — це, до речі, рекомендована практика для наукових публікацій.
Нові дивергентні кольорові карти
Крім нового колірного циклу, Matplotlib 3.10 додав три дивергентні кольорові карти: berlin, managua та vanimo. Якщо ви працюєте з даними, що мають природний нульовий рівень (відхилення від середнього, різниці температур, зміни показників), такі карти — саме те, що потрібно.
Кожна має свої особливості:
- berlin — від холодного синього через нейтральний до теплого червоного. Чудово підходить для температурних даних.
- managua — контрастна палітра з добрим розрізненням позитивних і негативних значень.
- vanimo — збалансована карта з м'якими переходами, добре працює для безперервних даних.
import matplotlib.pyplot as plt
import numpy as np
data = np.random.randn(20, 20)
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
cmaps = ['berlin', 'managua', 'vanimo']
for ax, cmap in zip(axes, cmaps):
im = ax.imshow(data, cmap=cmap, aspect='auto')
ax.set_title(f'Кольорова карта: {cmap}')
plt.colorbar(im, ax=ax)
plt.tight_layout()
plt.show()
Усі три карти пройшли перевірку на доступність, тому їх можна сміливо рекомендувати для наукових публікацій. На відміну від послідовних карт (як-от 'viridis' чи 'plasma'), дивергентні мають два виразних крайніх кольори й нейтральний центр. Це дає змогу інтуїтивно розрізняти позитивні та негативні відхилення — незамінна річ для теплових карт кореляцій, карт залишків моделей та географічних даних.
Підтримка вільнопоточного CPython 3.13
Matplotlib 3.10 додав попередню підтримку вільнопоточної (free-threaded) збірки CPython 3.13, що реалізує PEP 703. Це важливий крок до ефективного паралелізму без глобального блокування інтерпретатора (GIL).
Але є нюанси, про які варто знати:
- Робота з об'єктом
Figureв межах одного потоку повинна працювати коректно. - Використання глобального стану через
pyplotу багатопоточному контексті — не рекомендується (pyplot зберігає глобальний стан, який не є потокобезпечним). - Графічні інструментарії (GUI toolkits) очікують роботу в головному потоці ОС.
Якщо працюєте з паралельними обчисленнями, краще використовувати об'єктно-орієнтований інтерфейс Matplotlib (працюючи з об'єктами Figure та Axes напряму) замість процедурного pyplot. Підтримка поки що попередня, але сам факт її появи — хороший сигнал: спільнота активно готується до Python без GIL, і це відкриє нові можливості для паралельної генерації графіків у серверних застосунках.
Практичний приклад: створення професійного графіка
Тепер давайте об'єднаємо нові можливості у повноцінному прикладі. Побудуємо професійний багатопанельний графік з палітрою petroff10, який можна вставити у звіт чи презентацію:
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('petroff10')
np.random.seed(42)
months = ['Січ', 'Лют', 'Бер', 'Кві', 'Тра', 'Чер',
'Лип', 'Сер', 'Вер', 'Жов', 'Лис', 'Гру']
sales_a = np.random.randint(100, 500, 12)
sales_b = np.random.randint(80, 450, 12)
categories = ['Електроніка', 'Одяг', 'Їжа', 'Книги', 'Спорт']
values = np.random.randint(50, 300, len(categories))
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
axes[0].plot(months, sales_a, '-o', label='Продукт A')
axes[0].plot(months, sales_b, '-s', label='Продукт B')
axes[0].fill_between(months, sales_a, alpha=0.1)
axes[0].fill_between(months, sales_b, alpha=0.1)
axes[0].set_title('Продажі за місяцями')
axes[0].set_xlabel('Місяць')
axes[0].set_ylabel('Обсяг продажів')
axes[0].legend()
axes[0].tick_params(axis='x', rotation=45)
axes[1].barh(categories, values, color=plt.rcParams['axes.prop_cycle'].by_key()['color'][:5])
axes[1].set_title('Продажі за категоріями')
axes[1].set_xlabel('Обсяг')
plt.suptitle('Дашборд продажів — 2025', fontsize=16, fontweight='bold')
plt.tight_layout()
plt.show()
Тут ми створюємо дашборд із двох панелей: зліва — динаміка продажів двох продуктів протягом року з напівпрозорим заповненням, справа — горизонтальна гістограма за категоріями. Зверніть увагу, як отримуємо кольори з активного циклу через plt.rcParams['axes.prop_cycle'] — це забезпечує узгоджену палітру між панелями.
Seaborn 0.13: статистична візуалізація нового покоління
Seaborn давно став стандартом для статистичної візуалізації у Python. Версія 0.13 продовжує еволюцію: вдосконалений об'єктний інтерфейс, перероблені категоріальні функції і підтримка сучасних бібліотек для роботи з даними.
Інтерфейс seaborn.objects
Інтерфейс seaborn.objects, вперше представлений у 0.12 і суттєво вдосконалений у 0.13, — це принципово новий підхід до побудови графіків. Він базується на концепції граматики графіків (Grammar of Graphics), тій самій ідеї, що лежить в основі ggplot2 та Tableau.
Чому це крутий підхід? Ось ключові переваги:
- Композитність — графік будується пошарово, кожен шар додає свій тип відображення (точки, лінії, стовпці тощо).
- Декларативність — ви описуєте, що хочете побачити, а не як це побудувати крок за кроком.
- Понад двадцять класів для специфікації графіків: маркери, трансформації, статистичні перетворення, розкладки.
- Інтуїтивний ланцюжок методів — побудова графіка читається майже як опис природною мовою.
import seaborn.objects as so
import seaborn as sns
import pandas as pd
tips = sns.load_dataset('tips')
(
so.Plot(tips, x='total_bill', y='tip', color='time')
.add(so.Dot())
.add(so.Line(), so.PolyFit(order=2))
.facet('day')
.layout(size=(12, 4))
.label(title='Чайові залежно від суми рахунку')
.show()
)
Подивіться, як елегантно це виглядає: so.Plot визначає дані та відображення змінних; .add(so.Dot()) додає точки; .add(so.Line(), so.PolyFit(order=2)) — лінію тренду з поліноміальним згладжуванням; .facet('day') розбиває графік на панелі за днями тижня. І все це — буквально кілька рядків.
Перероблені категоріальні функції
У Seaborn 0.13 категоріальні функції побудови графіків були повністю переписані. Це масштабний рефакторинг, і він включає:
- Повне переписування внутрішньої логіки для кращої продуктивності та надійності.
- Новий параметр native_scale — контролює, чи числові або часові дані обробляються як категоріальні. Дуже корисна штука, коли потрібно зберегти правильний масштаб осі.
- Покращена підтримка параметра
hueдля розділення даних за кольором. - Більш передбачувана поведінка при комбінуванні різних типів графіків.
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset('tips')
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
sns.violinplot(data=tips, x='day', y='total_bill', hue='sex',
split=True, ax=axes[0])
axes[0].set_title('Розподіл рахунків за днями')
sns.boxplot(data=tips, x='day', y='tip', hue='time',
ax=axes[1])
axes[1].set_title('Чайові за днями та часом')
sns.swarmplot(data=tips, x='day', y='total_bill', hue='sex',
dodge=True, ax=axes[2], size=4)
axes[2].set_title('Бджолиний рій: рахунки за днями')
plt.tight_layout()
plt.show()
Цей приклад показує три категоріальних графіки для одного набору даних. Скрипковий графік (violinplot) — розподіл суми рахунку з розділенням за статтю; коробковий (boxplot) — чайові з розділенням за часом доби; а "бджолиний рій" (swarmplot) показує кожну точку даних без перекриття. Особисто мені найбільше подобається swarmplot для невеликих датасетів — він дає відчуття реальних даних, а не абстракції.
Підтримка Polars та інших DataFrame-бібліотек
Одне зі значних нововведень у Seaborn 0.13 — підтримка протоколу обміну даними DataFrame. Це означає, що Seaborn тепер приймає DataFrame не лише з pandas, а й із Polars — швидкої бібліотеки для роботи з даними, написаної на Rust.
Важливий нюанс: внутрішньо Seaborn все ще конвертує дані у pandas. Але можливість передати Polars DataFrame напряму — це зручно, особливо коли Polars вже використовується для попередньої обробки:
import polars as pl
import seaborn as sns
import matplotlib.pyplot as plt
df = pl.DataFrame({
'x': range(100),
'y': [i**0.5 + pl.Series([0]*100).sample(100).to_list()[0] for i in range(100)],
'group': ['A' if i % 2 == 0 else 'B' for i in range(100)]
})
# Seaborn 0.13 приймає Polars DataFrame безпосередньо
sns.scatterplot(data=df, x='x', y='y', hue='group')
plt.title('Polars DataFrame у Seaborn')
plt.show()
Ця інтеграція — частина ширшого тренду в екосистемі Python, де бібліотеки поступово додають підтримку різних бекендів. Для проєктів, де Polars є основною бібліотекою обробки даних (а таких стає все більше завдяки швидкості та ефективності пам'яті), це суттєво зменшує кількість шаблонного коду.
Розширене тематичне оформлення
Seaborn 0.13 значно покращив можливості тематичного оформлення. У об'єктному інтерфейсі objects.Plot тепер доступні стандартні теми та налаштування відображення, а легенди можна налаштовувати через параметр label у методі Plot.add().
Для класичного інтерфейсу Seaborn продовжує надавати потужні інструменти оформлення через sns.set_theme():
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme(style='whitegrid', palette='muted', font_scale=1.2)
penguins = sns.load_dataset('penguins').dropna()
g = sns.PairGrid(penguins, hue='species', corner=True)
g.map_lower(sns.scatterplot, alpha=0.6)
g.map_diag(sns.histplot, kde=True)
g.add_legend()
g.figure.suptitle('Аналіз видів пінгвінів', y=1.02)
plt.show()
Тут ми створюємо кутову матрицю парних графіків для набору даних про пінгвінів. Нижній трикутник — графіки розсіювання, діагональ — гістограми з оцінкою густини ядра (KDE). Тема 'whitegrid' дає чистий вигляд із ненав'язливою сіткою, а палітра 'muted' — приглушені кольори, приємні для ока. Чесно кажучи, набір даних про пінгвінів уже став новим "iris" у світі data science.
Plotly 6.x: інтерактивна візуалізація нового рівня
Plotly 6.0 вийшов 28 січня 2025 року, і це масштабне оновлення. Нова архітектура, краща продуктивність, ширша сумісність — розберемо все по черзі.
Narwhals: універсальна підтримка DataFrame
Найфундаментальніша зміна в Plotly 6.0 — повний перепис обробки DataFrame з використанням бібліотеки Narwhals. Narwhals — це легкий шар абстракції, що надає єдиний інтерфейс для роботи з різними DataFrame-бібліотеками.
Що це означає на практиці:
- Нативна підтримка pandas, Polars та інших бібліотек — передавайте дані без ручної конвертації.
- Відсутність копіювання в пам'яті — для бібліотек, відмінних від pandas, дані обробляються без проміжних копій, що суттєво зменшує використання пам'яті.
- Підвищення продуктивності для масштабних застосунків — особливо помітне у Dash-додатках, де обсяги даних бувають значними.
На практиці це означає: якщо ваш проєкт уже використовує Polars для ETL чи попередньої обробки, не потрібно конвертувати дані у pandas перед побудовою графіків. Narwhals обробляє це автоматично й ефективно.
Plotly.js 3.0 та base64-кодування
Під капотом Plotly для Python використовує JavaScript-бібліотеку Plotly.js для рендерингу. У версії 6.x оновлено до Plotly.js 3.0 з суттєвими архітектурними покращеннями:
- Перехід на ES6 імпорти — модульна архітектура замість застарілих CommonJS.
- esbuild замість webpack — швидша збірка, менший розмір пакету.
- Видалення jQuery та require.js — менший розмір, швидше завантаження, менше конфліктів з іншими бібліотеками.
- Base64-кодування — для швидшого обміну даними між JS та Python, що критично для інтерактивних дашбордів.
Усе це робить Plotly 6.x значно легшим і швидшим, особливо при завантаженні в браузері.
Практичні приклади з Plotly 6.x
Ну що ж, перейдемо до практики. Почнемо з інтерактивного лінійного графіка динаміки продажів за регіонами:
import plotly.express as px
import pandas as pd
df = pd.DataFrame({
'Місяць': ['Січ', 'Лют', 'Бер', 'Кві', 'Тра', 'Чер'] * 3,
'Продажі': [120, 150, 180, 200, 220, 250,
100, 130, 160, 190, 210, 240,
80, 110, 140, 170, 200, 230],
'Регіон': ['Київ'] * 6 + ['Львів'] * 6 + ['Одеса'] * 6
})
fig = px.line(df, x='Місяць', y='Продажі', color='Регіон',
markers=True,
title='Динаміка продажів за регіонами')
fig.update_layout(
xaxis_title='Місяць',
yaxis_title='Обсяг продажів (тис. грн)',
template='plotly_white',
hovermode='x unified'
)
fig.show()
При наведенні миші на будь-яку точку з'являється підказка з значеннями всіх регіонів для обраного місяця (завдяки hovermode='x unified'). Можна масштабувати графік, виділяючи область, або приховувати окремі серії, натискаючи на легенду. Дрібниця, а для презентацій — безцінна річ.
А тепер — інтерактивний дашборд із підграфіками:
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
categories = ['Електроніка', 'Одяг', 'Їжа', 'Книги', 'Спорт']
values_2024 = [300, 250, 400, 150, 200]
values_2025 = [350, 280, 420, 180, 260]
fig = make_subplots(
rows=1, cols=2,
subplot_titles=('Порівняння продажів', 'Розподіл за категоріями'),
specs=[[{'type': 'bar'}, {'type': 'pie'}]]
)
fig.add_trace(
go.Bar(name='2024', x=categories, y=values_2024, marker_color='#636EFA'),
row=1, col=1
)
fig.add_trace(
go.Bar(name='2025', x=categories, y=values_2025, marker_color='#EF553B'),
row=1, col=1
)
fig.add_trace(
go.Pie(labels=categories, values=values_2025, hole=0.4),
row=1, col=2
)
fig.update_layout(
title_text='Аналітичний дашборд продажів',
barmode='group',
height=500
)
fig.show()
Дашборд складається з двох панелей: зліва — групований стовпчастий графік порівняння продажів 2024 та 2025 років, справа — кругова діаграма розподілу за категоріями. Параметр hole=0.4 перетворює звичайну кругову діаграму на "пончик" — виглядає візуально привабливіше і залишає місце для додаткової інформації в центрі.
3D-візуалізація та анімації
Одна з найсильніших сторін Plotly — повноцінні 3D-графіки з обертанням, масштабуванням і наведенням. Це особливо корисно для візуалізації кластеризації, зниження розмірності (PCA, t-SNE, UMAP) чи просторових даних:
import plotly.express as px
import numpy as np
import pandas as pd
np.random.seed(42)
n = 300
df = pd.DataFrame({
'x': np.random.randn(n),
'y': np.random.randn(n),
'z': np.random.randn(n),
'Кластер': np.random.choice(['A', 'B', 'C'], n),
'Розмір': np.random.uniform(5, 25, n)
})
fig = px.scatter_3d(df, x='x', y='y', z='z',
color='Кластер', size='Розмір',
title='3D-візуалізація кластерів',
opacity=0.7)
fig.update_layout(scene=dict(
xaxis_title='Ознака X',
yaxis_title='Ознака Y',
zaxis_title='Ознака Z'
))
fig.show()
300 точок, три кластери, а розмір кожної точки додає четвертий вимір. Користувач може обертати графік мишею, масштабувати коліщатком і отримувати інфу про кожну точку при наведенні.
Plotly також дозволяє створювати анімації через параметр animation_frame у plotly.express. Динамічні графіки, що показують зміну даних у часі, особливо ефективні для презентацій — наприклад, еволюція демографічних показників за десятиліття чи рух фінансових індексів. Кнопки "Play" та "Pause" додаються автоматично, а слайдер дозволяє перейти до будь-якого кадру.
Порівняння бібліотек: яку обрати?
Отже, яку бібліотеку обрати? Залежить від завдання, аудиторії та формату. Ось порівняння за ключовими характеристиками:
| Характеристика | Matplotlib 3.10 | Seaborn 0.13 | Plotly 6.x |
|---|---|---|---|
| Тип візуалізації | Статичні графіки | Статичні + статистичні | Інтерактивні |
| Крива навчання | Помірна | Низька | Помірна |
| Інтерактивність | Обмежена | Обмежена | Повна |
| Найкращі для | Публікації, звіти, точне налаштування | EDA, статистичний аналіз | Дашборди, веб-застосунки |
| Підтримка DataFrame | pandas | pandas + Polars | pandas + Polars + інші |
| Кастомізація | Максимальна | Помірна | Висока |
А тепер конкретні рекомендації:
- Наукові публікації та друковані звіти — Matplotlib. Повний контроль дозволяє дотриматись точних вимог журналів щодо шрифтів, пропорцій і формату.
- Розвідувальний аналіз даних (EDA) — починайте з Seaborn. Мінімум коду, максимум інформації. Статистичні функції та гарне оформлення з коробки прискорюють дослідження.
- Інтерактивні дашборди та веб-застосунки — Plotly. Його інтеграція з Dash дозволяє будувати повноцінні веб-додатки без JavaScript.
- Презентації для бізнесу — комбінуйте Plotly для інтерактивних демо та Seaborn/Matplotlib для статичних слайдів.
- Щоденна робота — освойте всі три і обирайте за контекстом. Вони не конкурують, а доповнюють одна одну.
До речі, важливий момент: Seaborn побудований на Matplotlib, тому знання Matplotlib дозволяє глибоко кастомізувати будь-який графік Seaborn. Ця зв'язка — особливо потужна.
Найкращі практики візуалізації даних у 2025–2026
Незалежно від обраної бібліотеки, є універсальні принципи, яких варто дотримуватись. Ці речі допоможуть зробити графіки зрозумілими, інформативними й професійними.
Обирайте правильний тип графіка
Не всі типи графіків однаково підходять для різних даних. Коротка шпаргалка:
- Тренди у часі — лінійні графіки (
plot,px.line). - Порівняння категорій — стовпчасті діаграми (
bar,barh). - Розподіл однієї змінної — гістограми (
hist,histplot) або графіки густини (kdeplot). - Зв'язок між двома змінними — графіки розсіювання (
scatter,scatterplot). - Розподіл за категоріями — коробкові (
boxplot) або скрипкові (violinplot) графіки. - Пропорції — кругові або стековані стовпчасті діаграми (але з обережністю — їх часто використовують невдало).
- Кореляції — теплові карти (
heatmap).
Використовуйте доступні палітри
Приблизно 8% чоловіків та 0.5% жінок мають порушення кольорового зору. Це не маргінальна проблема — це мільйони людей. Використання доступних палітр — не лише хороший тон, а й необхідність.
Що рекомендую:
- petroff10 — новий стандарт Matplotlib 3.10, спеціально розроблений для доступності.
- tableau-colorblind10 — перевірена часом палітра з Tableau.
- Уникайте комбінації червоний-зелений — це найпоширеніший тип дальтонізму.
- Використовуйте маркери та штрихування разом із кольорами для подвійного кодування.
Загальні принципи
- Ненав'язлива сітка — тонкі, світлі лінії. Сітка має допомагати читанню, а не відволікати.
- Завжди додавайте підписи осей і заголовок — графік без підписів марний. Не забувайте про одиниці вимірювання.
- Анотації для ключових точок — виділяйте максимуми, мінімуми та аномалії текстом.
- Комбінуйте бібліотеки — не обмежуйтесь однією. Seaborn + Matplotlib — класична зв'язка.
Приклад: комбінування Seaborn та Matplotlib
Ось як виглядає потужність такого комбінування на практиці — Seaborn для швидкого створення, Matplotlib для ювелірного налаштування:
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
sns.set_theme(style='whitegrid')
tips = sns.load_dataset('tips')
fig, ax = plt.subplots(figsize=(10, 6))
sns.regplot(data=tips, x='total_bill', y='tip',
scatter_kws={'alpha': 0.5, 's': 50},
line_kws={'color': 'red', 'linewidth': 2},
ax=ax)
ax.set_title('Залежність чайових від суми рахунку', fontsize=14, fontweight='bold')
ax.set_xlabel('Сума рахунку ($)', fontsize=12)
ax.set_ylabel('Чайові ($)', fontsize=12)
ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('$%.2f'))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('$%.0f'))
z = np.polyfit(tips['total_bill'], tips['tip'], 1)
ax.annotate(f'y = {z[0]:.3f}x + {z[1]:.3f}',
xy=(0.05, 0.95), xycoords='axes fraction',
fontsize=11, bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.8))
plt.tight_layout()
plt.show()
Seaborn створює регресійний графік із довірчим інтервалом, а Matplotlib додає форматування валюти, жирний заголовок та анотацію з рівнянням регресії. Зверніть увагу на scatter_kws і line_kws — через них налаштовується зовнішній вигляд точок та лінії окремо.
Ключовий принцип простий: Seaborn — для швидкого старту та статистики, Matplotlib — для публікаційної якості.
Оптимізація для друку та експорту
Якщо готуєте графіки для публікацій, є кілька речей, про які легко забути (а потім шкодувати). Встановлюйте DPI не менше 300 при збереженні через fig.savefig(). Використовуйте векторні формати (SVG, PDF) для масштабованих графіків. І обов'язково перевіряйте, що шрифти залишаються читабельними після зменшення до розміру колонки у статті. Ці деталі часто ігнорують початківці, але саме вони відрізняють професійну візуалізацію від аматорської.
Інтеграція з Jupyter Notebook та сучасними середовищами
Сучасна робота з візуалізацією відбувається переважно в інтерактивних середовищах, і Jupyter Notebook з JupyterLab тут — безумовні лідери. Розберемо, як кожна бібліотека з ними інтегрується.
Matplotlib у Jupyter
Matplotlib працює з Jupyter через "магічні команди". Є два основних режими:
%matplotlib inline— статичні зображення прямо в чарунках. Найпоширеніший і найстабільніший варіант.%matplotlib widget— інтерактивний режим з масштабуванням та переміщенням. Потребує пакетуipympl.
Plotly у Jupyter
Plotly нативно підтримує JupyterLab та Jupyter Notebook 7+ — інтерактивні графіки відображаються прямо в чарунках без додаткових налаштувань. Важливо: Plotly 6.0 припинив підтримку Jupyter Notebook нижче версії 7. Якщо досі на старішій версії — час оновлюватись.
Підтримка marimo
Варто згадати й marimo — сучасний реактивний ноутбук для Python, який набирає популярності. На відміну від Jupyter, де чарунки можуть мати неузгоджений стан, marimo автоматично відстежує залежності між чарунками та перевиконує їх при зміні вхідних даних. І Plotly, і Matplotlib мають підтримку marimo, що робить його привабливим для інтерактивних звітів.
Налаштування середовища
Типові команди для налаштування візуалізації в Jupyter:
# Для Jupyter Notebook/Lab
%matplotlib inline
# Для інтерактивного режиму matplotlib
%matplotlib widget
# Plotly у Jupyter — працює автоматично
import plotly.io as pio
pio.renderers.default = 'notebook'
Для JupyterLab рекомендую рендерер 'notebook' або 'jupyterlab' для Plotly. У Jupyter Notebook 7+ Plotly працює автоматично.
Якщо ви у VS Code з розширенням Jupyter — все теж добре підтримується. Matplotlib дає статичні зображення в чарунках, Plotly — інтерактивні графіки в окремій панелі. Google Colab підтримує всі три бібліотеки без додаткового встановлення, що робить його зручним для швидкого прототипування. А для командної роботи варто розглянути JupyterHub — спільний доступ до ресурсів та ноутбуків для всієї команди.
Поради для продуктивної роботи
- Визначайте стиль і тему на початку ноутбука — так усі графіки матимуть узгоджений вигляд.
- Створюйте функції для повторюваних графіків, щоб не дублювати код.
- Зберігайте фінальні графіки через
fig.savefig()(Matplotlib/Seaborn) абоfig.write_image()(Plotly). - Для великих наборів даних використовуйте
plotly.expressзrender_mode='webgl'для апаратного прискорення.
Висновки та рекомендації
Екосистема візуалізації Python у 2025–2026 — потужніша та зручніша, ніж будь-коли. Кожна з трьох бібліотек зробила серйозний крок уперед:
- Matplotlib 3.10 — підвищив стандарти доступності з petroff10, додав нові дивергентні карти й почав готуватися до вільнопоточного Python.
- Seaborn 0.13 — зміцнив позицію найшвидшого інструмента для статистичної візуалізації: перероблені категоріальні функції, об'єктний інтерфейс, підтримка Polars.
- Plotly 6.x — переосмислив архітектуру з Narwhals та Plotly.js 3.0, забезпечивши кращу продуктивність і ширшу сумісність.
Рекомендації для різних категорій:
- Початківцям — стартуйте з Matplotlib для розуміння основ, потім Seaborn для повсякденного аналізу. Plotly додайте, коли знадобиться інтерактивність.
- Аналітикам даних — зробіть Seaborn основним інструментом для EDA, Plotly — для звітів і дашбордів, Matplotlib — для точного доведення окремих графіків.
- Інженерам даних — зосередьтесь на Plotly та Dash для дата-застосунків. Підтримка Polars у Plotly 6.x — ваш друг.
- Науковцям — Matplotlib залишається золотим стандартом для публікацій. Використовуйте petroff10 і Seaborn для складних статистичних графіків.
І головна порада: експериментуйте та комбінуйте. Жодна окрема бібліотека не покриває всіх сценаріїв ідеально. Сила Python — у можливості використовувати різні інструменти разом. Починайте з простого, поступово ускладнюйте, і з часом ви інтуїтивно відчуватимете, яка бібліотека найкраще пасує до конкретної задачі.
Для поглиблення знань рекомендуємо також ознайомитись із нашими матеріалами про pandas, NumPy, scikit-learn та Polars. Разом із бібліотеками візуалізації вони формують повноцінний інструментарій для аналізу даних у Python.
Світ візуалізації даних не стоїть на місці. Слідкуйте за оновленнями, вивчайте нове й не бійтесь нестандартних підходів. Зрештою, головна мета візуалізації — зробити дані зрозумілими та допомогти ухвалювати обґрунтовані рішення.