В предыдущей статье мы говорили об основных концептах 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)
Фигура в виде графических объектов (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()
Создание графических окон
Порой требуется отрисовать графики рядом друг с другом. На каждый график выделяется свое графическое окно (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()
Добавление трейсов (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-специалистов в Москве.