Построение графиков в Plotly с примерами кода

автор рубрика
Построение графиков в Plotly с примерами кода

В предыдущей статье мы говорили об основных концептах Python-библиотеки Plotly. Сегодня рассмотрим, как создавать и обновлять фигуры, макеты (layout) и трейсы (trace) в Plotly, а также размещение графиков рядом друг с другом.

Фигура в виде словаря (dict)

На самом низком уровне фигуры Plotly могут быть представлены в виде словаря (dict). Чтобы отрисовать фигуру, заданную в виде словаря, используйте модуль plotly.io. Ниже представлен Python-код для построения столбчатой диаграммы (bar).

fig = dict({
    "data": [{"type": "bar",
              "x": [1, 2, 3],
              "y": [1, 3, 2]}],
    "layout": {"title": {"text": "Bar chart"}}
})

import plotly.io as pio

pio.show(fig)
Пример диаграммы Plotly
Столбчатая диаграмма Plotly

Фигура в виде графических объектов (dict)

В модуле plotly.graph_objects есть специальные объекты под названием graph objects (графические объекты). Эти объекты также могут быть использованы для представления фигур, и они имеют некоторые преимущества перед словарями:

  • Графические объекты обеспечивают точную проверку данных. Если указывается недопустимое имя свойства или его значение, будет вызвано исключение с понятным описанием проблемы;
  • Графические объекты имеют документацию Python с полной справкой по API. Поэтому без проблем можно узнать о доступных свойствах прямо в среде разработки;
  • Доступ к свойствам графических объектов можно получить как с помощью поиска по ключу в словаре (например, fig ["layout"]), так и через точечный вызов (например, fig.layout);
  • Графические объекты поддерживают вспомогательные функции более высокого уровня для обновления уже построенных фигур (.update_layout(), .add_trace() и т. д.);
  • Конструкторы классов могут принимать аргументы, что делает запись более короткой и читабельной:
    Передача аргументов Использование словарей
    go.Figure(layout_title_text=”The Title”) dict(layout=dict(title=dict(text=”The Title”))))
  • Графические объекты поддерживают методы отрисовки (.show()) и экспорта (.write_image()) фигур. Поэтому не придётся дополнительно импортировать модуль plotly.io.

Вот так в Python выглядит та же столбчатая диаграмма, но только с использованием графических объектов:

import plotly.graph_objects as go

fig = go.Figure(
    data=[go.Bar(x=[1, 2, 3], y=[1, 3, 2])],
    layout=go.Layout(
        title=go.layout.Title(text="A Figure Specified By A Graph Object")
    )
)

fig.show()

Когда использовать графические объекты

Рекомендуемый способ построения фигур — это использование модуля Plotly Express. «Под капотом» данный модуль создает графические объекты.

Однако некоторые типы фигур не могут быть построены с помощью Plotly Express. К ним, например, относятся 3D-фигуры mesh (сетка) и isosurface (изоповерхность). А некоторые фигуры слишком сложно будет создать в Plotly Express (разные типы графиков на одном графическом окне, сооосные объекты или фасеточные графики с разными типами данных).

Во всех остальных случаях лучше использовать Plotly Express, поскольку создание фигур может занимать 1 строчку кода, а не от 5 до 100 с использованием графических объектов.

Plotly Express

Plotly Express – это высокоуровневый API для визуализации данных. С помощью него можно создавать графические объекты вызовом соответствующих функций. Ниже код на Python показывает, как построить диаграмму рассеяния с помощью Plotly Express.

import plotly.express as px

df = px.data.iris()
fig = px.scatter(df, 
                 x="sepal_width", y="sepal_length", 
                 color="species", 
                 title="A Plotly Express Figure")
fig.show()
Пример графика в Plotly Express
Диаграмма рассеяния, построенная с помощью Plotly Express

Создание графических окон

Порой требуется отрисовать графики рядом друг с другом. На каждый график выделяется свое графическое окно (subplot). А чтобы разместить несколько графиков на одном окне используется функция make_subplots, в которой нужно указать количество строк и столбцов. Результат работы этой функции можно рассматривать таблицу, где в ячейку вставляется график. Пример кода на Python будет выглядеть следующим образом:

from plotly.subplots import make_subplots
import plotly.graph_objects as go

fig = make_subplots(rows=1, cols=2)

fig.add_trace(go.Scatter(y=[4, 2, 1], mode="lines"), row=1, col=1)
fig.add_trace(go.Bar(y=[2, 1, 3]), row=1, col=2)

fig.show()
Пример графиков, которые стоят рядом друг с другом, Plotly Express
Графики на одной линии

Добавление трейсов (traces)

В прошлый раз мы упомянули, что каждый график с данными ассоциирован со своим трейсом (trace) в корневом атрибуте data. Новый трейс может быть добавлен с помощью метода add_trace (см. пример выше). Этот метод принимает графический объект и добавляет этот объект к фигуре. Можно также использовать метод append_trace, который не возвращает объект фигуры.

Как показано в примере выше, метод add_trace также принимает номер строки и столбца, если график нужно отрисовать в ячейке make_subplots.

Более удобный способ добавления трейсов

В качестве альтернативы методу add_trace можно использовать add_{trace}, где вместо {trace} нужно вставить тип трейса. Тогда не нужно импортировать модуль plotly.graph_objects. Например, ту же самую фигуру с двумя графиками на одной линии, в Python можно построить следующим образом:

from plotly.subplots import make_subplots

fig = make_subplots(rows=1, cols=2)

fig.add_scatter(y=[4, 2, 1], mode="lines", row=1, col=1)
fig.add_bar(y=[2, 1, 3], row=1, col=2)

fig.show()

Обновление макета (layout)

Макет layout может быть обновлён с помощью метода update_layout. О том, что включается в layout, вы можете посмотреть здесь. Код на Python для обновления заголовка и размера шрифта:

fig = go.Figure(data=go.Bar(x=[1, 2, 3], y=[1, 3, 2]))

fig.update_layout(title_text="Using update_layout() With Graph Object Figures",
                  title_font_size=30)

fig.show()

Обновление трейсов

Так же как и layout, трейсы могут быть обновлены с помощью метода update_traces. Обновлять трейсы можно как все сразу, так и на выбор. Чтобы обновить только определённые трейсы, нужно указать значение аргумента selector. Например, пусть имеется 4 трейса:

from plotly.subplots import make_subplots

fig = make_subplots(rows=1, cols=2)

fig.add_scatter(y=[4, 2, 3.5], mode="markers",
                marker=dict(size=20, color="LightSeaGreen"),
                name="a", row=1, col=1)

fig.add_bar(y=[2, 1, 3],
            marker=dict(color="MediumPurple"),
            name="b", row=1, col=1)

fig.add_scatter(y=[2, 3.5, 4], mode="markers",
                marker=dict(size=20, color="MediumPurple"),
                name="c", row=1, col=2)

fig.add_bar(y=[1, 3, 2],
            marker=dict(color="LightSeaGreen"),
            name="d", row=1, col=2)

тогда изменить цвет для всех столбчатых диаграмм можно, прописав:

fig.update_traces(marker=dict(color="RoyalBlue"),
                  selector=dict(type="bar"))

Кроме того, можно обновлять данные напрямую вызовом атрибутов:

fig = go.Figure(data=go.Bar(x=[1, 2, 3], y=[1, 3, 2]))

fig.data[0].marker.line.width = 4
fig.data[0].marker.line.color = "black"

 

 

О визуализации данных в Plotly, а также о том, как на реальных примерах Data Science использовать полученные визуальные представления для дальнейшей подготовки и обработки, вы узнаете на специализированном курсе «VIP: Визуализация данных на языке Python» в лицензированном учебном центре обучения и повышения квалификации IT-специалистов в Москве.

Источники
  1. https://plotly.com/python/creating-and-updating-figures/#conditionally-updating-traces
Комментировать

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