- Регистрация
- 23 Август 2023
- Сообщения
- 3 641
- Лучшие ответы
- 0
- Реакции
- 0
- Баллы
- 243
Offline
Plotly — библиотека для интерактивной визуализации данных в Python. Она подходит для задач, где статичного графика недостаточно, и важно исследовать данные прямо в процессе анализа.
В статье разбираем базовые возможности Plotly и основные типы графиков.
Иван Анисковец
Специалист по анализу данных и data science, эксперт модуля «Основы Python» на курсах Нетологии по аналитике. Помогал при подготовке статьи.
Что такое Plotly и зачем он нужен
Plotly используют, когда график нужен не только как итоговая картинка, а как инструмент для работы с данными. В отличие от matplotlib и seaborn, которые строят статичные визуализации, Plotly позволяет работать с графиком после построения: рассматривать отдельные точки, сравнивать серии данных и уточнять выводы по ходу анализа.
Библиотека поддерживает более 40 типов графиков, например: линейные и столбчатые диаграммы, scatter plot, гистограммы, box plot, тепловые карты, treemap и 3D-графики. Этого набора хватает для большинства задач анализа данных и учебных примеров.
Plotly удобно использовать в Jupyter Notebook и аналитических отчётах. Библиотека напрямую работает с pandas и сохраняет графики в HTML-формате.
Как устроена библиотека Plotly
Plotly состоит из двух уровней, которые решают разные задачи. Это важно понимать, потому что от выбранного уровня зависит и объём кода, и степень контроля над графиком.
1 уровень — Plotly Express
Это высокоуровневый интерфейс, который строит графики по принципу «один вызов — один график». Plotly Express берёт на себя большую часть работы: выбирает тип визуализации, настраивает оси, легенду и интерактивные элементы. Такой подход хорошо подходит для анализа данных, когда важно быстро посмотреть на распределения, сравнить группы или проверить гипотезу.
2 уровень — низкоуровневый API Plotly (graph_objects)
Позволяет вручную управлять структурой графика: работать с отдельными слоями, осями, подграфиками и интерактивными элементами. Он даёт больше гибкости, но требует больше кода и понимания того, как устроен график внутри.
Обычно работает так: Plotly Express используют для быстрого старта и большинства типовых задач, а к низкоуровневому API переходят, когда нужно нестандартное поведение или точная настройка визуализации.
В этой статье мы фокусируемся на Plotly Express и базовых возможностях Plotly. Этого достаточно, чтобы разобраться в библиотеке и начать использовать интерактивные графики в анализе данных.
Быстрый старт в Plotly Express
Для работы с Plotly не нужна специальная настройка окружения. Достаточно обычного Python-стека для анализа данных: Python 3, pip и pandas.
Установка
Откройте терминал и выполните команду:
pip install plotly
Если вы работаете в Jupyter Notebook, дополнительные зависимости устанавливать не нужно — интерактивные графики будут отображаться прямо в ноутбуке.
Импорт и первый график
Для быстрого старта используют Plotly Express. Ниже — минимальный пример графика, который можно запустить сразу после установки.
Чтобы не придумывать данные вручную, возьмём готовый учебный датасет iris. Его можно получить прямо из Plotly одной строкой.
Запустите Python (например, командой python или python3) и выполните код:
import pandas as pd
import plotly.express as px
df = px.data.iris()
fig = px.line(df, x="sepal_length", y="petal_length")
fig.show()
Здесь px.data.iris() возвращает таблицу с данными об ирисах. В ней есть числовые признаки (длина и ширина чашелистика и лепестка) и категориальный признак species — вид ириса.
Если вы работаете в Jupyter Notebook, график отобразится прямо под ячейкой с кодом. Если запускаете код как обычный Python-скрипт — Plotly откроет график в браузере.
Основные графики
Далее в примерах мы будем также использовать датасет iris.
Точечная диаграмма (Scatter Plot)
Scatter plot используют, чтобы оценить связь между двумя числовыми признаками, увидеть возможные группы значений и заметить выбросы. Например, в реальных кейсах можно посмотреть, как меняется объём продаж в зависимости от цены товара.
Построим такой график на датасете iris: по оси X — длина лепестка, по оси Y — его ширина, а цветом покажем вид ириса. Так как данные мы загрузили через px.data.iris(), дальше просто используем названия столбцов из этой таблицы:
fig = px.scatter(
df,
x="petal_length",
y="petal_width",
color="species",
title="Ирисы: длина и ширина лепестка"
)
fig.show()
Что получаем на выходе:
Длина и ширина лепестка у трёх видов ириса
По графику удобно сравнить, как различаются длина и ширина лепестка у разных видов и где их значения частично совпадают.
В интерактивной версии можно посмотреть значения точки, а через легенду временно скрыть один из видов и рассмотреть остальные.
Линейный график (Line Chart)
Линейный график подходит для отображения изменений показателя во времени или по другой упорядоченной шкале. Он помогает увидеть рост, падение и колебания значений.
Например, можно отследить, как меняется количество визитов, регистраций или активных пользователей со временем.
В датасете iris нет времени, но мы всё равно можем построить линейный график, если заранее упорядочим данные. Для примера посмотрим, как в среднем меняется длина лепестка при увеличении длины чашелистика у разных видов ириса.
Сначала отсортируем данные по длине чашелистика внутри каждого вида, чтобы линии шли последовательно, а не «прыгали» между случайными точками.
import pandas as pd
import plotly.express as px
df = px.data.iris()
# Сортируем данные по виду ириса и длине чашелистика
df_sorted = df.sort_values(["species", "sepal_length"])
fig = px.line(
df_sorted,
x="sepal_length",
y="petal_length",
color="species",
title="Связь длины лепестка с длиной чашелистика у ирисов"
)
fig.show()
Что получаем:
На графике каждая линия соответствует одному виду ириса. По оси X отложена длина чашелистика, по оси Y — длина лепестка.
Такой график позволяет увидеть общий тренд: как в пределах каждого вида меняется размер лепестка при увеличении размера чашелистика.
Можно навести курсор на точку и посмотреть её значение, а также приблизить участок линии, чтобы рассмотреть его подробнее.
Столбчатая диаграмма (Bar Chart)
Столбчатую диаграмму используют, когда нужно сравнить значения между категориями: например, по группам, типам или классам объектов. Такой график хорошо подходит для ситуаций, где важны не изменения во времени, а различия между отдельными категориями.
Например, в службе поддержки часто считают, сколько обращений приходится на разные типы проблем
Построим пример на датасете iris и посмотрим, как отличается средняя длина лепестка у разных видов ириса.
df_bar = df.groupby("species", as_index=False)["petal length (cm)"].mean()
fig = px.bar(
df_bar,
x="species",
y="petal length (cm)",
title="Средняя длина лепестка у разных видов ириса"
)
fig.show()
Как выглядит график:
Столбчатая диаграмма показывает разницу между видами ириса по средней длине лепестка. В отличие от scatter plot, здесь не отдельные измерения, а итог по группе.
В интерактивном режиме можно посмотреть точные значения столбцов и управлять отображением видов через легенду.
Гистограмма (Histogram)
Гистограмму используют, когда нужно посмотреть, как распределяются значения одного числового показателя: где их больше, где меньше и есть ли перекосы или хвосты.
На практике он полезен, например, чтобы посмотреть, как распределяется время ответа службы поддержки и часто ли встречаются слишком долгие ответы.
Посмотрим, как распределяется длина лепестка у ирисов.
fig = px.histogram(
df,
x="petal length (cm)",
nbins=20,
title="Распределение длины лепестка"
)
fig.show()
График будет таким:
Гистограмма не сравнивает виды между собой, а показывает общую картину по одному признаку — как часто встречаются разные значения длины лепестка.
При наведении на столбец видно, сколько наблюдений попало в этот интервал. График можно приблизить, чтобы рассмотреть распределение подробнее.
Диаграмма размаха (Box Plot)
Box plot используют, когда нужно сравнить распределение значений между группами и увидеть, где показатель в среднем выше, где разброс больше и есть ли выбросы.
В практических задачах такой график, например, полезен, чтобы сравнить сроки доставки у разных служб и понять, где заказы обычно приходят быстрее, а где чаще случаются задержки.
Посмотрим, как отличается длина лепестка у разных видов ириса.
fig = px.box(
df,
x="species",
y="petal length (cm)",
title="Длина лепестка у разных видов ириса"
)
fig.show()
Что получим:
Диаграмма показывает, чем отличаются виды ириса по длине лепестка: не только по среднему размеру, но и по тому, насколько сильно значения колеблются внутри каждого вида.
Можно посмотреть числовые значения элементов диаграммы и временно скрыть один из видов, чтобы сравнить остальные.
Тепловая карта (Heatmap)
Тепловую карту используют, когда нужно быстро понять, как связаны между собой несколько числовых показателей. Вместо отдельных точек и линий здесь сразу видно общую картину: какие признаки меняются вместе, а какие почти не связаны.
Посмотрим, как соотносятся между собой признаки в датасете iris.
corr = df.drop(columns=["species"]).corr()
fig = px.imshow(
corr,
text_auto=True,
title="Корреляции между признаками ирисов"
)
fig.show()
Результат:
По тепловой карте видно, какие признаки ведут себя похоже, а какие почти не зависят друг от друга. Например, длина и ширина лепестка оказываются ближе друг к другу, чем признаки чашелистика. Такой график помогает быстро заметить сильные и слабые связи, не просматривая таблицу чисел.
При наведении на ячейку видно точное значение связи. Карту можно приблизить, чтобы рассмотреть нужный участок подробнее.
Графики для специфических задач
Скрипичная диаграмма (Violin Plot)
Violin plot используют, когда нужно сравнить группы и при этом увидеть, как распределяются значения внутри каждой из них — то есть не только где середина и границы, но и в каких диапазонах значений данных больше, а в каких меньше.
Это похоже на box plot: он тоже показывает разброс значений внутри группы. Разница в том, что violin plot дополнительно визуализирует форму распределения — где значения встречаются чаще, а где реже.
На практике такой график используют, например, чтобы сравнить время выполнения задач в разных командах и понять, где сроки стабильнее, а где чаще случаются задержки.
Посмотрим на датасете iris:
fig = px.violin(
df,
x="species",
y="petal length (cm)",
box=True,
points="all",
title="Распределение длины лепестка у разных видов ириса"
)
fig.show()
Получаем график:
По «скрипкам» видно, в каких диапазонах длина лепестка встречается чаще и как отличаются распределения у разных видов ириса. Такой график помогает заметить не только разницу в размерах лепестков, но и то, насколько значения внутри каждого вида похожи друг на друга или, наоборот, сильно разнятся.
В интерактивной версии можно посмотреть числовые значения участков диаграммы и временно скрыть один из видов, чтобы сравнить остальные.
Группированные и накопленные столбцы (Grouped / Stacked Bar Chart)
Эти диаграммы нужны, когда хочется посмотреть на данные сразу в двух разрезах — например, по месяцам и по типам товаров.
В группированном виде столбцы стоят рядом, и по ним легко сравнить подкатегории между собой. В накопленном виде части складываются в один столбец — так видно общий результат и вклад каждой части.
Сравним среднюю длину лепестка у разных видов ириса и для наглядности разобьём длину чашелистика на две группы: короткую и длинную. Это искусственное разбиение нужно только для примера, чтобы появился второй признак.
df_group = df.copy()
# Разбиваем длину чашелистика на 2 группы
df_group["sepal_group"] = pd.cut(
df_group["sepal_length"],
bins=[0, 5, 10],
labels=["короткий", "длинный"]
)
# Считаем среднюю длину лепестка по виду ириса и группе чашелистика
df_bar = df_group.groupby(
["species", "sepal_group"], as_index=False
)["petal_length"].mean()
Группированные столбцы:
fig = px.bar(
df_bar,
x="species",
y="petal_length",
color="sepal_group",
barmode="group",
title="Средняя длина лепестка по видам ириса и длине чашелистика"
)
fig.show()
Результат:
В этом графике столбцы разных групп стоят рядом. Так удобно сравнивать, например, короткие и длинные чашелистики внутри каждого вида ириса.
Накопленные столбцы
fig = px.bar(
df_bar,
x="species",
y="petal_length",
color="sepal_group",
barmode="stack",
title="Средняя длина лепестка по видам ириса и длине чашелистика"
)
fig.show()
Получаем такой график:
Он показывает разницу между видами ириса и одновременно различия внутри каждого вида. В интерактивной версии можно навести курсор на отдельный сегмент и посмотреть его значение, а через легенду временно убрать одну из подгрупп, чтобы сравнить остальные.
Древовидная карта (Treemap)
Treemap используют, когда нужно показать структуру данных: из каких частей она состоит и какая часть больше, а какая меньше.
График выглядит как набор прямоугольников: каждый прямоугольник — это категория, а его размер показывает величину показателя. Чем больше прямоугольник, тем больше значение.
Treemap удобно использовать, например, чтобы быстро сравнить продажи по категориям или посмотреть, какие сегменты пользователей выделяются по метрике.
Снова возьмём датасет iris и сравним виды ириса по средней длине лепестка:
df_tree = df.groupby("species", as_index=False)["petal_length"].mean()
fig = px.treemap(
df_tree,
path=["species"],
values="petal_length",
title="Средняя длина лепестка по видам ириса"
)
fig.show()
Результат:
По площади прямоугольников видно, у какого вида ириса средняя длина лепестка больше, а у какого — меньше: чем больше прямоугольник, тем выше значение показателя.
В интерактивной версии можно навести курсор на прямоугольник и увидеть точное число, а также кликнуть по элементу, чтобы приблизить выбранную часть.
Немного про оформление
Если график нужен для статьи, отчёта или показа кому-то ещё, его нужно докрутить. Чаще всего дорабатывают подписи, подсказки и легенду.
Заголовок и подписи осей
По умолчанию Plotly берёт названия колонок из таблицы. Для себя это терпимо, но для читателя лучше явно написать, что именно показано.
Допустим, у нас уже есть построенный scatter plot с ирисами (мы создавали его в предыдущих разделах). Теперь можем донастроить его подписи:
fig.update_layout(
title="Связь длины и ширины лепестка у ирисов",
xaxis_title="Длина лепестка, см",
yaxis_title="Ширина лепестка, см"
)
Теперь не нужно догадываться, что за цифры по осям и про что вообще график.
Подсказки при наведении
Если ничего не настраивать, Plotly показывает подсказку так, как данные лежат в таблице. При наведении на точку вы увидите что-то вроде: petal length (cm): 4.7, petal width (cm): 1.4, species: versicolor.
Сами данные верные, но в таком виде подсказка выглядит как техническая справка. Поэтому её обычно упрощают: оставляют только нужные значения и подписывают их понятными словами. Например, вместо petal length (cm): 4.7 показывают «Длина: 4.7 см», а вместо petal width (cm): 1.4 — «Ширина: 1.4 см». Так воспринимать график намного легче.
Вот как это сделать на примере scatter plot с ирисами:
fig.update_traces(
hovertemplate=(
"Длина: %{x} см<br>"
"Ширина: %{y} см<br>"
"Вид: %{customdata}"
),
customdata=df["species"]
)
В подсказке будет:
Длина: 4.7 см
Ширина: 1.4 см
Вид: versicolor
Если вид ириса уже показан цветом точек на графике, его можно не дублировать в подсказке и оставить только числовые значения.
Делаем это вот так:
fig.update_traces(
hovertemplate=(
"Длина: %{x} см<br>"
"Ширина: %{y} см"
)
)
Чтобы это работало, логично, что цвет точек должен соответствовать виду ириса. Разберёмся, как настраиваются цвета и легенда.
Цвета и легенда
Цвет задаётся в момент построения графика. В нашем примере мы раскрашиваем точки по столбцу species:
fig = px.scatter(
df,
x="petal length (cm)",
y="petal width (cm)",
color="species"
)
Plotly сам назначает цвета группам и сразу рисует легенду.
Легенда нужна, чтобы было понятно, какой цвет к какой группе относится. Часто её переименовывают, чтобы подпись была более понятной.
Например:
fig.update_layout(
legend_title_text="Вид ириса"
)
Теперь по легенде видно, какой цвет соответствует каждому виду.
Свои цвета можно задать вручную, но в большинстве случаев это не обязательно. Стандартная палитра Plotly уже подходит для анализа и примеров. К кастомным цветам обычно переходят, когда график нужен для презентации, статьи или когда важно соблюдать фирменный стиль.
Ограничения Plotly
Вот три ситуации, когда Plotly, скорее всего, не подойдёт.
Первая — когда данных слишком много. Plotly строит график в браузере, и при большом количестве точек интерактивность может начать тормозить: график дольше загружается, масштабирование и наведение работают с задержкой. Обычно это становится заметно, когда счёт идёт на десятки тысяч точек, но точный порог зависит от типа графика и среды выполнения.
Вторая — когда график нужен как обычная картинка для статьи или отчёта. Интерактивность там всё равно не работает, а код и зависимости у Plotly сложнее, чем у статичных библиотек. То есть, по сути, вы используете сложный инструмент ради обычного изображения. Для таких задач проще сразу брать matplotlib или seaborn.
Ещё один момент связан с форматом. Plotly отлично подходит для ноутбуков и браузера, но для печати и PDF-отчётов его обычно не выбирают. Опять же, в этих форматах интерактивность не нужна, и внешний вид графика важнее.
Кратко подытожим
Plotly нужен в тех случаях, когда график — это часть анализа, а не просто картинка для отчёта. С его помощью можно не только увидеть форму данных, но и разобраться в них: посмотреть конкретные значения, сравнить группы и проверить, как ведут себя показатели.
В большинстве задач достаточно Plotly Express и базовых графиков, которые мы разобрали в статье. Этого набора хватает, чтобы решать типовые задачи анализа и понимать структуру данных. Более сложные возможности Plotly имеют смысл подключать, когда появляется конкретная потребность в нестандартной визуализации.
Чтобы расти, нужно выйти из привычной зоны и сделать шаг к переменам. Можно изучить новое, начав с бесплатных занятий и мероприятий:
Или можно стать востребованным сотрудником и открыть открыть бóльшие перспективы в карьере с профессиональным обучением:
В статье разбираем базовые возможности Plotly и основные типы графиков.
Иван Анисковец
Специалист по анализу данных и data science, эксперт модуля «Основы Python» на курсах Нетологии по аналитике. Помогал при подготовке статьи.
Что такое Plotly и зачем он нужен
Plotly используют, когда график нужен не только как итоговая картинка, а как инструмент для работы с данными. В отличие от matplotlib и seaborn, которые строят статичные визуализации, Plotly позволяет работать с графиком после построения: рассматривать отдельные точки, сравнивать серии данных и уточнять выводы по ходу анализа.
Библиотека поддерживает более 40 типов графиков, например: линейные и столбчатые диаграммы, scatter plot, гистограммы, box plot, тепловые карты, treemap и 3D-графики. Этого набора хватает для большинства задач анализа данных и учебных примеров.
Plotly удобно использовать в Jupyter Notebook и аналитических отчётах. Библиотека напрямую работает с pandas и сохраняет графики в HTML-формате.
Как устроена библиотека Plotly
Plotly состоит из двух уровней, которые решают разные задачи. Это важно понимать, потому что от выбранного уровня зависит и объём кода, и степень контроля над графиком.
1 уровень — Plotly Express
Это высокоуровневый интерфейс, который строит графики по принципу «один вызов — один график». Plotly Express берёт на себя большую часть работы: выбирает тип визуализации, настраивает оси, легенду и интерактивные элементы. Такой подход хорошо подходит для анализа данных, когда важно быстро посмотреть на распределения, сравнить группы или проверить гипотезу.
2 уровень — низкоуровневый API Plotly (graph_objects)
Позволяет вручную управлять структурой графика: работать с отдельными слоями, осями, подграфиками и интерактивными элементами. Он даёт больше гибкости, но требует больше кода и понимания того, как устроен график внутри.
Обычно работает так: Plotly Express используют для быстрого старта и большинства типовых задач, а к низкоуровневому API переходят, когда нужно нестандартное поведение или точная настройка визуализации.
В этой статье мы фокусируемся на Plotly Express и базовых возможностях Plotly. Этого достаточно, чтобы разобраться в библиотеке и начать использовать интерактивные графики в анализе данных.
Быстрый старт в Plotly Express
Для работы с Plotly не нужна специальная настройка окружения. Достаточно обычного Python-стека для анализа данных: Python 3, pip и pandas.
Установка
Откройте терминал и выполните команду:
pip install plotly
Если вы работаете в Jupyter Notebook, дополнительные зависимости устанавливать не нужно — интерактивные графики будут отображаться прямо в ноутбуке.
Импорт и первый график
Для быстрого старта используют Plotly Express. Ниже — минимальный пример графика, который можно запустить сразу после установки.
Чтобы не придумывать данные вручную, возьмём готовый учебный датасет iris. Его можно получить прямо из Plotly одной строкой.
Запустите Python (например, командой python или python3) и выполните код:
import pandas as pd
import plotly.express as px
df = px.data.iris()
fig = px.line(df, x="sepal_length", y="petal_length")
fig.show()
Здесь px.data.iris() возвращает таблицу с данными об ирисах. В ней есть числовые признаки (длина и ширина чашелистика и лепестка) и категориальный признак species — вид ириса.
Если вы работаете в Jupyter Notebook, график отобразится прямо под ячейкой с кодом. Если запускаете код как обычный Python-скрипт — Plotly откроет график в браузере.
Основные графики
Далее в примерах мы будем также использовать датасет iris.
Точечная диаграмма (Scatter Plot)
Scatter plot используют, чтобы оценить связь между двумя числовыми признаками, увидеть возможные группы значений и заметить выбросы. Например, в реальных кейсах можно посмотреть, как меняется объём продаж в зависимости от цены товара.
Построим такой график на датасете iris: по оси X — длина лепестка, по оси Y — его ширина, а цветом покажем вид ириса. Так как данные мы загрузили через px.data.iris(), дальше просто используем названия столбцов из этой таблицы:
fig = px.scatter(
df,
x="petal_length",
y="petal_width",
color="species",
title="Ирисы: длина и ширина лепестка"
)
fig.show()
Что получаем на выходе:
Длина и ширина лепестка у трёх видов ириса
По графику удобно сравнить, как различаются длина и ширина лепестка у разных видов и где их значения частично совпадают.
В интерактивной версии можно посмотреть значения точки, а через легенду временно скрыть один из видов и рассмотреть остальные.
Линейный график (Line Chart)
Линейный график подходит для отображения изменений показателя во времени или по другой упорядоченной шкале. Он помогает увидеть рост, падение и колебания значений.
Например, можно отследить, как меняется количество визитов, регистраций или активных пользователей со временем.
В датасете iris нет времени, но мы всё равно можем построить линейный график, если заранее упорядочим данные. Для примера посмотрим, как в среднем меняется длина лепестка при увеличении длины чашелистика у разных видов ириса.
Сначала отсортируем данные по длине чашелистика внутри каждого вида, чтобы линии шли последовательно, а не «прыгали» между случайными точками.
import pandas as pd
import plotly.express as px
df = px.data.iris()
# Сортируем данные по виду ириса и длине чашелистика
df_sorted = df.sort_values(["species", "sepal_length"])
fig = px.line(
df_sorted,
x="sepal_length",
y="petal_length",
color="species",
title="Связь длины лепестка с длиной чашелистика у ирисов"
)
fig.show()
Что получаем:
На графике каждая линия соответствует одному виду ириса. По оси X отложена длина чашелистика, по оси Y — длина лепестка.
Такой график позволяет увидеть общий тренд: как в пределах каждого вида меняется размер лепестка при увеличении размера чашелистика.
Можно навести курсор на точку и посмотреть её значение, а также приблизить участок линии, чтобы рассмотреть его подробнее.
Столбчатая диаграмма (Bar Chart)
Столбчатую диаграмму используют, когда нужно сравнить значения между категориями: например, по группам, типам или классам объектов. Такой график хорошо подходит для ситуаций, где важны не изменения во времени, а различия между отдельными категориями.
Например, в службе поддержки часто считают, сколько обращений приходится на разные типы проблем
Построим пример на датасете iris и посмотрим, как отличается средняя длина лепестка у разных видов ириса.
df_bar = df.groupby("species", as_index=False)["petal length (cm)"].mean()
fig = px.bar(
df_bar,
x="species",
y="petal length (cm)",
title="Средняя длина лепестка у разных видов ириса"
)
fig.show()
Как выглядит график:
Столбчатая диаграмма показывает разницу между видами ириса по средней длине лепестка. В отличие от scatter plot, здесь не отдельные измерения, а итог по группе.
В интерактивном режиме можно посмотреть точные значения столбцов и управлять отображением видов через легенду.
Гистограмма (Histogram)
Гистограмму используют, когда нужно посмотреть, как распределяются значения одного числового показателя: где их больше, где меньше и есть ли перекосы или хвосты.
На практике он полезен, например, чтобы посмотреть, как распределяется время ответа службы поддержки и часто ли встречаются слишком долгие ответы.
Посмотрим, как распределяется длина лепестка у ирисов.
fig = px.histogram(
df,
x="petal length (cm)",
nbins=20,
title="Распределение длины лепестка"
)
fig.show()
График будет таким:
Гистограмма не сравнивает виды между собой, а показывает общую картину по одному признаку — как часто встречаются разные значения длины лепестка.
При наведении на столбец видно, сколько наблюдений попало в этот интервал. График можно приблизить, чтобы рассмотреть распределение подробнее.
Диаграмма размаха (Box Plot)
Box plot используют, когда нужно сравнить распределение значений между группами и увидеть, где показатель в среднем выше, где разброс больше и есть ли выбросы.
В практических задачах такой график, например, полезен, чтобы сравнить сроки доставки у разных служб и понять, где заказы обычно приходят быстрее, а где чаще случаются задержки.
Посмотрим, как отличается длина лепестка у разных видов ириса.
fig = px.box(
df,
x="species",
y="petal length (cm)",
title="Длина лепестка у разных видов ириса"
)
fig.show()
Что получим:
Диаграмма показывает, чем отличаются виды ириса по длине лепестка: не только по среднему размеру, но и по тому, насколько сильно значения колеблются внутри каждого вида.
Можно посмотреть числовые значения элементов диаграммы и временно скрыть один из видов, чтобы сравнить остальные.
Тепловая карта (Heatmap)
Тепловую карту используют, когда нужно быстро понять, как связаны между собой несколько числовых показателей. Вместо отдельных точек и линий здесь сразу видно общую картину: какие признаки меняются вместе, а какие почти не связаны.
Посмотрим, как соотносятся между собой признаки в датасете iris.
corr = df.drop(columns=["species"]).corr()
fig = px.imshow(
corr,
text_auto=True,
title="Корреляции между признаками ирисов"
)
fig.show()
Результат:
По тепловой карте видно, какие признаки ведут себя похоже, а какие почти не зависят друг от друга. Например, длина и ширина лепестка оказываются ближе друг к другу, чем признаки чашелистика. Такой график помогает быстро заметить сильные и слабые связи, не просматривая таблицу чисел.
При наведении на ячейку видно точное значение связи. Карту можно приблизить, чтобы рассмотреть нужный участок подробнее.
Графики для специфических задач
Скрипичная диаграмма (Violin Plot)
Violin plot используют, когда нужно сравнить группы и при этом увидеть, как распределяются значения внутри каждой из них — то есть не только где середина и границы, но и в каких диапазонах значений данных больше, а в каких меньше.
Это похоже на box plot: он тоже показывает разброс значений внутри группы. Разница в том, что violin plot дополнительно визуализирует форму распределения — где значения встречаются чаще, а где реже.
На практике такой график используют, например, чтобы сравнить время выполнения задач в разных командах и понять, где сроки стабильнее, а где чаще случаются задержки.
Посмотрим на датасете iris:
fig = px.violin(
df,
x="species",
y="petal length (cm)",
box=True,
points="all",
title="Распределение длины лепестка у разных видов ириса"
)
fig.show()
Получаем график:
По «скрипкам» видно, в каких диапазонах длина лепестка встречается чаще и как отличаются распределения у разных видов ириса. Такой график помогает заметить не только разницу в размерах лепестков, но и то, насколько значения внутри каждого вида похожи друг на друга или, наоборот, сильно разнятся.
В интерактивной версии можно посмотреть числовые значения участков диаграммы и временно скрыть один из видов, чтобы сравнить остальные.
Группированные и накопленные столбцы (Grouped / Stacked Bar Chart)
Эти диаграммы нужны, когда хочется посмотреть на данные сразу в двух разрезах — например, по месяцам и по типам товаров.
В группированном виде столбцы стоят рядом, и по ним легко сравнить подкатегории между собой. В накопленном виде части складываются в один столбец — так видно общий результат и вклад каждой части.
Сравним среднюю длину лепестка у разных видов ириса и для наглядности разобьём длину чашелистика на две группы: короткую и длинную. Это искусственное разбиение нужно только для примера, чтобы появился второй признак.
df_group = df.copy()
# Разбиваем длину чашелистика на 2 группы
df_group["sepal_group"] = pd.cut(
df_group["sepal_length"],
bins=[0, 5, 10],
labels=["короткий", "длинный"]
)
# Считаем среднюю длину лепестка по виду ириса и группе чашелистика
df_bar = df_group.groupby(
["species", "sepal_group"], as_index=False
)["petal_length"].mean()
Группированные столбцы:
fig = px.bar(
df_bar,
x="species",
y="petal_length",
color="sepal_group",
barmode="group",
title="Средняя длина лепестка по видам ириса и длине чашелистика"
)
fig.show()
Результат:
В этом графике столбцы разных групп стоят рядом. Так удобно сравнивать, например, короткие и длинные чашелистики внутри каждого вида ириса.
Накопленные столбцы
fig = px.bar(
df_bar,
x="species",
y="petal_length",
color="sepal_group",
barmode="stack",
title="Средняя длина лепестка по видам ириса и длине чашелистика"
)
fig.show()
Получаем такой график:
Он показывает разницу между видами ириса и одновременно различия внутри каждого вида. В интерактивной версии можно навести курсор на отдельный сегмент и посмотреть его значение, а через легенду временно убрать одну из подгрупп, чтобы сравнить остальные.
Древовидная карта (Treemap)
Treemap используют, когда нужно показать структуру данных: из каких частей она состоит и какая часть больше, а какая меньше.
График выглядит как набор прямоугольников: каждый прямоугольник — это категория, а его размер показывает величину показателя. Чем больше прямоугольник, тем больше значение.
Treemap удобно использовать, например, чтобы быстро сравнить продажи по категориям или посмотреть, какие сегменты пользователей выделяются по метрике.
Снова возьмём датасет iris и сравним виды ириса по средней длине лепестка:
df_tree = df.groupby("species", as_index=False)["petal_length"].mean()
fig = px.treemap(
df_tree,
path=["species"],
values="petal_length",
title="Средняя длина лепестка по видам ириса"
)
fig.show()
Результат:
По площади прямоугольников видно, у какого вида ириса средняя длина лепестка больше, а у какого — меньше: чем больше прямоугольник, тем выше значение показателя.
В интерактивной версии можно навести курсор на прямоугольник и увидеть точное число, а также кликнуть по элементу, чтобы приблизить выбранную часть.
Немного про оформление
Если график нужен для статьи, отчёта или показа кому-то ещё, его нужно докрутить. Чаще всего дорабатывают подписи, подсказки и легенду.
Заголовок и подписи осей
По умолчанию Plotly берёт названия колонок из таблицы. Для себя это терпимо, но для читателя лучше явно написать, что именно показано.
Допустим, у нас уже есть построенный scatter plot с ирисами (мы создавали его в предыдущих разделах). Теперь можем донастроить его подписи:
fig.update_layout(
title="Связь длины и ширины лепестка у ирисов",
xaxis_title="Длина лепестка, см",
yaxis_title="Ширина лепестка, см"
)
Теперь не нужно догадываться, что за цифры по осям и про что вообще график.
Подсказки при наведении
Если ничего не настраивать, Plotly показывает подсказку так, как данные лежат в таблице. При наведении на точку вы увидите что-то вроде: petal length (cm): 4.7, petal width (cm): 1.4, species: versicolor.
Сами данные верные, но в таком виде подсказка выглядит как техническая справка. Поэтому её обычно упрощают: оставляют только нужные значения и подписывают их понятными словами. Например, вместо petal length (cm): 4.7 показывают «Длина: 4.7 см», а вместо petal width (cm): 1.4 — «Ширина: 1.4 см». Так воспринимать график намного легче.
Вот как это сделать на примере scatter plot с ирисами:
fig.update_traces(
hovertemplate=(
"Длина: %{x} см<br>"
"Ширина: %{y} см<br>"
"Вид: %{customdata}"
),
customdata=df["species"]
)
В подсказке будет:
Длина: 4.7 см
Ширина: 1.4 см
Вид: versicolor
Если вид ириса уже показан цветом точек на графике, его можно не дублировать в подсказке и оставить только числовые значения.
Делаем это вот так:
fig.update_traces(
hovertemplate=(
"Длина: %{x} см<br>"
"Ширина: %{y} см"
)
)
Чтобы это работало, логично, что цвет точек должен соответствовать виду ириса. Разберёмся, как настраиваются цвета и легенда.
Цвета и легенда
Цвет задаётся в момент построения графика. В нашем примере мы раскрашиваем точки по столбцу species:
fig = px.scatter(
df,
x="petal length (cm)",
y="petal width (cm)",
color="species"
)
Plotly сам назначает цвета группам и сразу рисует легенду.
Легенда нужна, чтобы было понятно, какой цвет к какой группе относится. Часто её переименовывают, чтобы подпись была более понятной.
Например:
fig.update_layout(
legend_title_text="Вид ириса"
)
Теперь по легенде видно, какой цвет соответствует каждому виду.
Свои цвета можно задать вручную, но в большинстве случаев это не обязательно. Стандартная палитра Plotly уже подходит для анализа и примеров. К кастомным цветам обычно переходят, когда график нужен для презентации, статьи или когда важно соблюдать фирменный стиль.
Ограничения Plotly
Вот три ситуации, когда Plotly, скорее всего, не подойдёт.
Первая — когда данных слишком много. Plotly строит график в браузере, и при большом количестве точек интерактивность может начать тормозить: график дольше загружается, масштабирование и наведение работают с задержкой. Обычно это становится заметно, когда счёт идёт на десятки тысяч точек, но точный порог зависит от типа графика и среды выполнения.
Вторая — когда график нужен как обычная картинка для статьи или отчёта. Интерактивность там всё равно не работает, а код и зависимости у Plotly сложнее, чем у статичных библиотек. То есть, по сути, вы используете сложный инструмент ради обычного изображения. Для таких задач проще сразу брать matplotlib или seaborn.
Ещё один момент связан с форматом. Plotly отлично подходит для ноутбуков и браузера, но для печати и PDF-отчётов его обычно не выбирают. Опять же, в этих форматах интерактивность не нужна, и внешний вид графика важнее.
Кратко подытожим
Plotly нужен в тех случаях, когда график — это часть анализа, а не просто картинка для отчёта. С его помощью можно не только увидеть форму данных, но и разобраться в них: посмотреть конкретные значения, сравнить группы и проверить, как ведут себя показатели.
В большинстве задач достаточно Plotly Express и базовых графиков, которые мы разобрали в статье. Этого набора хватает, чтобы решать типовые задачи анализа и понимать структуру данных. Более сложные возможности Plotly имеют смысл подключать, когда появляется конкретная потребность в нестандартной визуализации.
Чтобы расти, нужно выйти из привычной зоны и сделать шаг к переменам. Можно изучить новое, начав с бесплатных занятий и мероприятий:
вебинара «Карьера в IT: как ИИ даёт преимущество на рынке в 2026 году»;
курса «Системный аналитик: первые шаги к профессии»;
дня открытых дверей онлайн-магистратуры НИУ ВШЭ «Кибербезопасность»;
воркшопа «1C-аналитик: погружение в профессию на практике»;
курса-симулятора «Бизнес-аналитик: первые шаги в профессии».
Или можно стать востребованным сотрудником и открыть открыть бóльшие перспективы в карьере с профессиональным обучением:
на расширенном курсе «Системный аналитик» с программой трудоустройства и стажировок;
на курсе «Нейросети для анализа данных»;
на программе профессиональной переподготовки «ИИ-разработчик: от API до агентов» совместно с МТУСИ;
на курсе «Аналитика данных» с МФТИ;
на практическом курсе Data Scientist с оплачиваемой стажировкой и возможностью выбрать свой уровень погружения.