Встречайте: версия 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()