Советы и приемы по организации визуализаций Jupyter Notebook

Оптимизируйте рабочий процесс по изучению данных, автоматизировав вывод matplotlib – с помощью 1 строки кода. Вот как.

Называть вещи сложно. После достаточно долгого рабочего дня мы все закончили с такими описательными “graph7(1)_FINAL(2).png” и “output.pdf”. Знакомо?

Мы можем сделать лучше – и довольно легко.

Когда мы используем ориентированные на данные механизмы построения графиков в стиле “seaborn-esque”, все ингредиенты для создания описательного имени файла уже есть. Типичный вызов выглядит следующим образом,

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time")

Здесь мы знаем, что на оси x у нас есть “total_bill”, “time” выделено цветом и т. д. А что, если использовать имя функции построения и семантические ключи столбцов для организации вывода?

Вот как выглядит этот рабочий процесс с использованием инструмента teeplot.

import seaborn as sns; import teeplot as tp
tp.save = {".eps": True, ".pdf": True}  # set custom output behavior
tp.tee(sns.scatterplot,
   data=sns.load_data("tips"), x="total_bill", y="tip", hue="time")
Советы и приемы по организации визуализаций Jupyter Notebook

teeplots/hue=time+viz=scatterplot+x=total-bill+y=tip+ext=.eps
teeplots/hue=time+viz=scatterplot+x=total-bill+y=tip+ext=.pdf

В этом примере мы сделали три вещи: 1) отобразили график в блокноте, 2) сохранили визуализацию в файл с осмысленным именем и 3) подключили нашу визуализацию к фреймворку, где выходными данными блокнота можно управлять на глобальном уровне (в данном случае включив вывод в eps/pdf).

В этой статье мы расскажем, как использовать Python-пакет teeplot для лучшей организации и освобождения умственной нагрузки, чтобы сосредоточиться на более интересных вещах.

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

Рабочий процесс тейп-плота

teeplot предназначен для упрощения работы с визуализациями данных, созданными с помощью таких библиотек, как matplotlib, seaborn и pandas. Он действует как обертка вокруг ваших вызовов черчения, чтобы управлять выводом данных за вас.

Советы и приемы по организации визуализаций Jupyter Notebook
рабочий процесс в тейп-лоте в действии

Вот как использовать teeplot в 3 шага,

  1. Выберите функцию построения: Начните с выбора предпочтительной функции построения графиков, будь то функция из matplotlib, seaborn, pandas и т. д. или та, которую вы написали сами.
  2. Добавьте аргументы для построения: Передайте свою функцию построения в качестве первого аргумента tee, а затем аргументы, которые вы хотите использовать для визуализации.
  3. Автоматическое построение и сохранение: teeplot перехватывает вашу функцию построения и ее аргументы, выполняет построение, а затем заботится о том, чтобы вывести результаты построения за вас.

Вот и все!

Далее рассмотрим 3 кратких примера, демонстрирующих: а) базовое использование, б) пользовательскую постобработку и в) пользовательские функции построения графиков.

Пример 1: Использование встроенного плоттера pandas

В этом примере мы передаем функцию-член DataFrame df df.plot.box в качестве плоттера и два семантических ключа: “возраст” и “пол”. Об остальном позаботится teeplot.

# adapted pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.box.html
import pandas as pd; from teeplot import teeplot as tp

age_list = [8, 10, 12, 14, 72, 74, 76, 78, 20, 25, 30, 35, 60, 85]
df = pd.DataFrame({"gender": list("MMMMMMMMFFFFFF"), "age": age_list})

tp.tee(df.plot.box,  # plotter...
    column="age", by="gender", figsize=(4, 3))  # ...forwaded to plotter

teeplots/by=gender+column=age+viz=box+ext=.pdf
teeplots/by=gender+column=age+viz=box+ext=.png

Советы и приемы по организации визуализаций Jupyter Notebook

Пример 2: Matplotlib с ручными настройками

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

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

# adapted from https://matplotlib.org/stable/tutorials/pyplot.html
from matplotlib import pyplot as plt
import numpy as np; from teeplot import teeplot as tp

# tee output format can be configured globally (or per call to tp.tee)
tp.save = {".eps": True}  # make calls output to .eps only

# set up example data
df = {'weight': np.arange(50), 'profit': np.random.randint(0, 50, 50),
        'carbon': np.random.randn(50)}
df['price'], = df['weight'] + 10 * np.random.randn(50)
df['carbon'] = np.abs(df['carbon']) * 100

# ----- begin plotting -----
saveit, __ = tp.tee(  # --- "saveit" is callback to finalize output
    plt.scatter,  # plotter...
    data=df,  # then plotting kwargs
    x='weight', y='price', c='profit', s='carbon',
    teeplot_callback=True)  # defer plotting to callback

# tweak visualization as you usually would...
plt.xlabel('entry a')  
plt.ylabel('entry b')
plt.gcf().set_size_inches(5, 3)
saveit()  # dispatch output callback

teeplots/c=profit+s=carbon+viz=scatter+x=weight+y=price+ext=.eps

Советы и приемы по организации визуализаций Jupyter Notebook

Обратите внимание на значение __, распакованное из вызова tp.tee выше. Это потому, что возвращаемое значение plt.scatter представляет собой коллекцию строк, которая не пригодится для наших настроек.

Пример 3: Пользовательский плоттер

Пользовательские плоттеры работают так же, как и плоттеры из внешних библиотек – teeplot может определить имя вашей функции плоттинга по ключу вывода viz=.

from matplotlib import pyplot as plt; import seaborn as sns
from teeplot import teeplot as tp

def cuteplot(subject, descriptor, amount):  # custom plotter
    sns.dogplot()
    plt.gca().text(10, 400, 
        f"{subject} \n is a {descriptor} dog" + "!" * amount,
        color="white", size=40)

tp.tee(cuteplot,  # plotter
    amount=4, subject="who", descriptor="good",  # plotting args
    teeplot_outinclude="amount")  # override to use numeric kwarg in filename

teeplots/amount=4+descriptor=good+subject=who+viz=cuteplot+ext=.png
teeplots/amount=4+descriptor=good+subject=who+viz=cuteplot+ext=.pdf

Советы и приемы по организации визуализаций Jupyter Notebook

Кричалка sns.dogplot… всегда воет!

Дополнительная информация

Советы и приемы по организации визуализаций Jupyter Notebook

И это все!

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

Библиотека teeplot имеет несколько дополнительных возможностей, помимо тех, что были рассмотрены здесь, например, возможность настройки через переменные окружения (полезно в CI!). Подробнее об этом можно прочитать в руководстве по использованию и листинге API проекта. Проект имеет открытый исходный код на GitHub по адресу mmore500/teeplot – подумайте о том, чтобы оставить ⭐️!

teeplot может быть установлен как python3 -m pip install teeplot

Ссылки

J. D. Hunter, “Matplotlib: A 2D Graphics Environment”, Computing in Science & Engineering, vol. 9, no. 3, pp. 90–95, 2007. https://doi.org/10.1109/MCSE.2007.55

Data structures for statistical computing in python, McKinney, Proceedings of the 9th Python in Science Conference, Volume 445, 2010. https://doi.org/ 10.25080/Majora-92bf1922–00a

Matthew Andres Moreno. (2023). mmore500/teeplot. Zenodo. https://doi.org/10.5281/zenodo.10440670

Waskom, M. L., (2021). seaborn: statistical data visualization. Journal of Open Source Software, 6(60), 3021, https://doi.org/10.21105/joss.03021.

Приложение

Чтобы установить зависимости для примеров, приведенных в этой статье,

python3 -m pip install \
    matplotlib `# ==3.8.2`\
    numpy `# ==1.26.2` \
    teeplot `# ==1.0.1` \
    pandas `# ==2.1.3` \
    seaborn `# ==0.13.0`

Если не указано иное, все изображения принадлежат автору. Изображение “dogplot” создано на сайте seaborn, копию лицензии seaborn можно найти здесь.

+1
0
+1
0
+1
0
+1
0
+1
0

Ответить

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