Визуализация данных в Python

Следует ли использовать интерактивную библиотеку Python, такую как Plotly, или статическую, такую как Matplotlib? Все зависит от того, какой тип визуализации вам нужен.

Matplotlib и Plotly — мощные инструменты для визуализации данных. Но эти библиотеки были созданы для разных целей. Выбор зависит от назначения вашего приложения Python.

Matplotlib, разработанная в начале 2000-х годов, представляет собой очень гибкую низкоуровневую библиотеку для создания высококачественных статических графиков, готовых к печати.

Plotly является более новой библиотекой, созданной для интерактивной работы в веб-среде.

Plotly использует собственную JavaScript-библиотеку plotly.js для рендеринга графиков — Python-приложение генерирует JSON-спецификацию, которая передается в JavaScript-библиотеку для рендеринга. Matplotlib, напротив, использует разные бэкенды в зависимости от требуемого формата вывода.

Таким образом, хотя эти две библиотеки дополняют друг друга (если Matplotlib позволяет отображать визуализации на веб-странице, в Plotly можно загружать визуализации в виде статических графиков для печати), они являются разными инструментами и созданы для разных целей.

Чтобы облегчить вам выбор подходящего решения, рассмотрим три аспекта этих библиотек: простоту использования, стиль и интерактивность.

Простота использования

Библиотека Plotly доступна в двух вариантах: Plotly Graph Objects (GO) и Plotly Express. GO — эффективная низкоуровневая библиотека, с помощью которой можно создавать практически любые типы диаграмм, а Plotly Express — высокоуровневая библиотека, которая оборачивает код GO для предоставления стандартных типов диаграмм.

Matplotlib — явно низкоуровневая библиотека, которая, как и GO, обеспечивает очень точный контроль над внешним видом диаграмм. Если вам нужен API более высокого уровня, более соответствующий уровню Plotly Express, то следует использовать библиотеку, основанную на Matplotlib, такую как Pandas plotting или Seaborn.

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

import pandas as pd
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import plotly.express as px

# Образец фиктивных данных
data = {
    "Product": ["A", "B", "C", "D"],
    "Sales": [150, 200, 300, 250]
}

# Создать DataFrame
df = pd.DataFrame(data)

# ---------------------------
# 1. Объекты графа Plotly
# ---------------------------
fig_go = go.Figure([go.Bar(x=df["Product"], y=df["Sales"])])
fig_go.update_layout(title="Bar Chart - Plotly Graph Objects", width=500, height=400)
fig_go.show()

# ---------------------------
# 2. Matplotlib
# ---------------------------
plt.figure(figsize=(5,4))
plt.bar(df["Product"], df["Sales"])
plt.title("Bar Chart - Matplotlib")
plt.xlabel("Product")
plt.ylabel("Sales")
plt.show()

# ---------------------------
# 3. Plotly Express
# ---------------------------
fig_px = px.bar(df, x="Product", y="Sales", color="Product", title="Bar Chart - Plotly Express")
fig_px.update_layout(width=500, height=400)
fig_px.show()

# ---------------------------
# 4. График Pandas
# ---------------------------
df.set_index("Product")["Sales"].plot(kind="bar", figsize=(5,4), title="Bar Chart - Pandas Plot")
plt.ylabel("Sales")
plt.show()

Таким образом, обе библиотеки имеют низкоуровневые интерфейсы и обе могут быть запрограммированы на более высоком, удобном для использования уровне с помощью других библиотек, которые оборачивают низкоуровневые функции.

Примечание: весь код, приведенный в этой статье, находится в общедоступном Colab Notebook — здесь.

Стиль

Мне попадались критические комментарии по поводу старомодного внешнего вида Matplotlib по сравнению с более современным стилем Plotly. В принципе, я их понимаю; как видно на изображении ниже, диаграмма Matplotlib довольно традиционна, тогда как диаграмма Plotly выглядит более современной. Но все же считаю эту критику несколько несправедливой.

Лично я не являюсь большим поклонником стиля по умолчанию ни Matplotlib, ни Plotly. Зато обе библиотеки позволяют легко изменять шаблон стиля с помощью встроенных альтернатив. Можно также скачать множество сторонних шаблонов стилей или определить свой собственный.

Вот сравнение диаграмм Plotly и Matplotlib, каждая из которых использует похожий шаблон ggplot. Между ними нет большой разницы.

Если же нужен более современный стиль в Matplotlib (то есть, больше похожий на Plotly), можно использовать такие стили, как тема Dufte от Matplotx. Ее легко установить.

Скриншот, приведенный ниже, показывает результат работы Matplotlib с использованием темы Dufte, но вас можно понять, если вы подумали, что это продукт Plotly.

Если говорить о моих собственных вкусах, то им удовлетворяет скриншот изображения Plotly, созданного с использованием шаблона plotly_white.

Таким образом, обе библиотеки можно легко адаптировать к предпочитаемому вами стилю.

При этом, если вы являетесь пользователем Streamlit, то обнаружите, что ограничены двумя шаблонами Plotly: тем, который определен Streamlit (и который соответствует внешнему виду Streamlit), или стандартным Plotly-шаблоном. Если попытаетесь изменить Plotly-шаблон программным способом, Streamlit проигнорирует это изменение.

Суть в том, что любая из библиотек позволяет создавать графики нестандартного вида. При этом у вас есть возможность определять собственный стиль.

Интерактивность

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

Вот скриншот, демонстрирующий взаимодействие в Plotly.

Это не то, что вы получаете с Matplotlib; все взаимодействия должны быть запрограммированы в приложении.

Однако, если вам, например, нужно изменение диапазона данных, отображаемых с помощью ползунка в пользовательском интерфейсе, т. е. интерактивность на уровне приложения, то результаты будут такими же, как и в случае применения любой из библиотек, потому что в этом случае вы просто обновляете статический график.

Построение графиков в Pandas — лучшая из возможностей?

Здесь стоит упомянуть Pandas, поскольку эта библиотека может служить мостом между двумя вышеупомянутыми. Pandas предоставляет простой способ создания графиков непосредственно из датафреймов. При этом для рендеринга графиков можно использовать разные бэкенды. Таким образом, у вас есть возможность с помощью похожего кода создавать эквивалентные графики Matplotlib и Plotly.

Не все аспекты этих библиотек охвачены построением графиков в Pandas. Поэтому вы можете столкнуться с тем, что какой-то график работает с одним бэкендом, но не работает с другим. И, как увидите ниже, параметры приходится адаптировать под используемый бэкенд.

Ниже приведён код, который создает такие же столбчатые диаграммы, как и выше, с использованием Plotly и Matplotlib, но в обоих случаях с применением библиотеки построения графиков Pandas.

import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px

pd.options.plotting.backend = "matplotlib"
df.plot(x='Product', y='Sales', kind='bar', 
        title='Pandas Plot (Matplotlib Backend)', 
        figsize=(8,4),legend=False)
plt.xlabel('Product')
plt.ylabel('Sales')
plt.show()

# График Pandas с бэкендом Plotly
pd.options.plotting.backend = "plotly"
fig_plotly = df.plot(x='Product', y='Sales', kind='bar', 
                     title='Pandas Plot (Plotly Backend)',
                     height=600, width=800)

fig_plotly.show()

Как видите, для настройки размера графика параметры должны быть такими же, как и в нативных библиотеках.

Тип приложения

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

Огромное количество публикаций и отчетов распространяется в формате PDF — речь идет не только о научных статьях, но также о бизнес-отчетах и брифингах. Это популярный формат, даже если результат не печатается. В PDF, разумеется, теряется всякая интерактивность. В плане печати у Plotly нет преимуществ перед Matplotlib, которая была создана именно для этой цели.

Однако, если нужно создать интерактивное веб-приложение, выбор не так очевиден. Если вы собираетесь использовать платформу приложений, такую как Streamlit, и вас не интересует интерактивность внутри диаграмм, то между библиотеками большой разницы нет. Все сводится к тому, насколько вам удобно их программировать и насколько устраивают стили создаваемых ими диаграмм.

Но если для вас важна возможность наводить курсор на точки данных и видеть их значения, то Plotly — очевидный выбор.

Весь код и диаграммы, приведенные в этой статье, доступны в общедоступном Jupyter Notebook на Google Colab (вот ссылка на код).

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Alan Jones: Matplotlib or Plotly: how to choose the right Python visualization library

Предыдущая статьяПочему я позволяю ИИ помогать мне думать — но не думать за меня