Советы и приемы по организации визуализаций 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")
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. Он действует как обертка вокруг ваших вызовов черчения, чтобы управлять выводом данных за вас.
Вот как использовать teeplot в 3 шага,
- Выберите функцию построения: Начните с выбора предпочтительной функции построения графиков, будь то функция из matplotlib, seaborn, pandas и т. д. или та, которую вы написали сами.
- Добавьте аргументы для построения: Передайте свою функцию построения в качестве первого аргумента tee, а затем аргументы, которые вы хотите использовать для визуализации.
- Автоматическое построение и сохранение: 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
Пример 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
Обратите внимание на значение __, распакованное из вызова 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
Кричалка sns.dogplot… всегда воет!
Дополнительная информация
И это все!
Я регулярно использую этот инструмент в течение последних двух лет, а недавно решил найти время, чтобы упаковать его и поделиться. Надеюсь, он будет полезен сообществу.
Библиотека 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 можно найти здесь.