Встречайте: версия 4.0 графической библиотеки plotly для Python

Вышла четвертая версия библиотеки plotly для построения графиков и диаграмм средствами Python. Подробно обо всех нововведениях.

В сравнении с предыдущей версией команда разработчиков сделала ряд существенных дополнений и изменений. Более ясно разделили режимы офлайн и онлайн. Внедрен и оптимизирован Plotly Express. Реализован новый фреймворк рендеринга. Последний теперь совместим не только с блокнотами Jupyter, но и с блокнотами Colab, Azure, Kaggle, средами PyCharm, VSCode и Spyder.

Для обновления до последней версии используйте одну из следующих команд. В зависимости от используемого окружения (pip/conda):

pip install plotly==4.0.0

или

conda install -c plotly plotly==4.0.0

Подробную информацию о переходе к четвертой версии вы можете найти в руководствах по началу работы с plotly и миграции на четвертую версию.

Автономный режим по умолчанию

Предыдущие версии библиотеки plotly содержали всё необходимое для работы в онлайн- и офлайн-режимах. Изображения загружались в экземпляр специальной онлайн-службы Chart Studio. Или – при автономной работе – отрисовывались локально.

Но такая двойственность послужила источником различных нестыковок. Начиная с четвертой версии, основным режимом стал автономный. Не требуется ни подключение к интернету, ни учетная запись, ни платежи. Поддержка онлайн-режима перенесена в отдельно устанавливаемый пакет chart-studio. То есть новая версия библиотеки по умолчанию не предполагает загрузки изображений в облако.

Plotly Express

В этом году в библиотеке появился модуль Plotly Express. Его задача – упростить и ускорить создание графиков на основе подготовленных данных с помощью однострочных команд на Python. Plotly Express был хорошо принят сообществом, поэтому с четвертой версии модуль по умолчанию включен в библиотеку. Документация теперь включает примеры с использованием Plotly Express в верхней части каждой страницы. Можно сказать, что plotly.express по отношению к plotly является тем же, чем seaborn по отношению к matplotlib.

Обратите внимание: если вы уже использовали автономный пакет plotly_express, вы можете обновить его до последней версии, перенесенной в plotly.

Plotly Express поддерживает широкий спектр диаграмм, включая многомерные отображения, матрицы рассеяния (SPLOM), графики параллельных координат и параллельных категорий.

Отображение в любых блокнотах

В дополнение к тому, что стандартным режимом стал автономный, пакет plotly.offline был переопределен поверх новой расширяемой среды рендеринга.

Графики plotly «из коробки» отображаются в следующих средах:

  • JupyterLab и классические блокноты Jupyter.
  • Другие блокноты: Colab, nteract, Azure, Kaggle.
  • Интегрированные среды разработки и интерфейсы командной строки VSCode, PyCharm, QtConsole, Spyder.
  • Другие контексты, такие как sphinx-gallery.
  • Приложения Dash через dash_core_components.Graph().
  • Статичные растровые и векторные файлы посредством fig.write_image().
  • Автономные интерактивные HTML-страницы методом fig.write_html().
  • Встраивание в любой вебсайт через fig.to_json() и Plotly.js.

Как следует из документации библиотеки, используемый ранее стиль plotly.offline.iplot(figure) всё еще работает. Но рекомендуемый способ отображения рисунков – вызов figure.show(). Аналогично для экспорта рисунка в HTML-файл рекомендуется вместо plotly.offline.plot(figure) применять figure.write_html().

Новая тема по умолчанию

Поддержка тем была введена еще в версии 3.4. В четвертой версии дефолтная тема приводит к общему стилю все изображения, создаваемые с plotly. В документации имеется подробный раздел о работе с темами и шаблонами со множеством примеров кода и иллюстраций.

Новые методы обновления изображений библиотеки plotly

Одной из задач библиотеки является удобство уточнения интересующих областей диаграмм после отрисовки по имеющимся данным. В четвертой версии эту работу выполняет набор методов для обновления графиков после их построения. Эти функции возвращают ссылку на вызывающую их функцию и позволяют, таким образом, строить цепочки. Кроме того, в новой версии введена нотация "магических подчеркиваний" (magic underscore notation), упрощающая процесс обновления свойств вложенных фигур.

# старый подход: один метод .update(), сильно вложенные аргументы
fig.update(layout=go.Layout(legend=dict(orientation="h"))

# новый способ: специальный метод update_layout
fig.update_layout(legend=dict(orientation="h"))

# свежий подход: underscore notation
fig.update_layout(legend_orientation="h")

Пример использования последних методов для настройки рисунка, созданного с помощью Plotly Express:

import plotly.express as px
df = px.data.tips()
(px.bar(df, x="size", y="tip", facet_row="time", facet_col="day", 
   color="sex", title="Tips by Payer Sex, Party Size, Day and Meal")
      .update_traces(marker_line_width=0.5)
      .update_yaxes(tickprefix="$")
      .update_xaxes(type="category")
      .update_layout(title_font_size=24) )

Более гибкое оформление внутренних блоков

Существенное внимание в версии 4.0 уделено функции make_subplots. Эта функция нужна для создания рисунков, объединяющих несколько графиков. Теперь она поддерживает все типы графиков и осей: 2D, 3D, полярные, карты, круговые диаграммы, солнечные вспышки, диаграммы Sankey и т. д. Да и создание графиков с двойной осью ординат стало проще.

Вышеописанные методы апдейта рисунков умеют работать с аргументами row, col и second_y, задающими участки блока и двойные оси. Аналогичный набор аргументов доступен в Plotly Express.

Пример ниже создает и заполняет сетку 2 x 2, содержащую 4 различных типа графиков:

from plotly.subplots import make_subplots
fig = make_subplots(rows=2, cols=2,
                    specs=[[{"type": "xy"}, {"type": "polar"}],
                           [{"type": "domain"}, {"type": "scene"}]])
fig.add_bar(row=1, col=1, y=[2, 3, 1], )
fig.add_pie(row=2, col=1, values=[2, 3, 1])
fig.add_barpolar(row=1, col=2, theta=[0, 45, 90], r=[2, 3, 1])
fig.add_scatter3d(row=2, col=2, x=[2, 3], y=[0, 0], z=[0.5, 1])
fig.update_layout(height=700, showlegend=False)
fig.show()

Пример создания диаграммы с двумя осями ординат с различным цветом числовых засечек на соответствующих осях:

from plotly.subplots import make_subplots
fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_scatter(secondary_y=False, x=[1, 2, 3], y=[40, 50, 60],
                marker_color="MediumSlateBlue", name="Pressure")
fig.add_scatter(secondary_y=True,  x=[2, 3, 4], y=[4, 5, 6],
                marker_color="DarkOrange", name="Temperature")
fig.update_yaxes(secondary_y=False,
                 tickfont_color="MediumSlateBlue", title="KPa")
fig.update_yaxes(secondary_y=True,
                 tickfont_color="DarkOrange", title="° Celsius")
fig.update_layout(title_text="A dual-Y-axis chart")
fig.show()

Поддержка JupyterLab 1.0

Расширение @jupyterlab/plotly-extension для рендеринга графиков в JupyterLab было заменено новым расширением jupyterlab-plotly. Последнее будет поддерживаться и обновляться как часть библиотеки plotly.

Новое расширение по сравнению с исходным сокращает время загрузки блокнотов, содержащих большое количество графиков. Это делается путем первоначального отображения сохраненных рисунков в виде статических изображений. При наведении курсора они заменяются рисунками Plotly.js. Для поддержки JupyterLab 1.0 было  также обновлено расширение plotlywidget для рендеринга фигур FigureWidget.

Меньший размер библиотеки

Чтобы уменьшить объем дистрибутива, файлы географических форм перемещены в опциональный пакет plotly-geo. Это сократило размер библиотеки с начальных 27.4 Мб до 4.7 Мб.

Подмодуль graph_objs переименован в более легко произносимое и запоминаемое graph_objects. В качестве инструкции import рекомендуется следующая:

import plotly.graph_objects as go

Полная совместимость с Dash

Наконец, все рисунки в новой версии библиотеки plotly на 100% совместимы с Dash. Ниже вы найдете пример простого Dash-приложения. Пример включает некоторые из новых функций, таких как Plotly Express, цепочечные методы обновления и магические подчеркивания:

import dash
import dash_core_components as dcc
import plotly.express as px
def dynamic_layout():
    df = px.data.tips() # could be a database query instead!
    return dcc.Graph(figure=px.bar(df, x="day", y="tip")
                            .update_yaxes(tickprefix="$")
                            .update_layout(legend_orientation="h"))
app = dash.Dash(__name__)
app.layout = dynamic_layout
app.run_server()

Используете ли вы возможности библиотеки plotly в своей работе? Пишите в комментариях.

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

admin
11 декабря 2018

ООП на Python: концепции, принципы и примеры реализации

Программирование на Python допускает различные методологии, но в его основе...
admin
14 июля 2017

Пишем свою нейросеть: пошаговое руководство

Отличный гайд про нейросеть от теории к практике. Вы узнаете из каких элеме...