Узнайте об объектах фигур и осей в Matplotlib

Вступление

Прочитав эту статью, вы изучите два основных объекта графиков Maptlolib: фигуру и оси. Вы, наконец, поймете разницу между простым построением графиков (plt.plot) и созданием подзаголовков с помощью plt.subplots().

Когда вы начнете свое путешествие в науку о данных, вы познакомитесь с Matplotlib как с вашей первой библиотекой для визуализации данных. Большинство руководств для новичков жестоко обманывают студентов, сначала знакомя их с дружественным для новичков pyplot > plt интерфейсом. По мере того, как эти бедные студенты отваживаются в реальный мир, они узнают, что парни из StackOverflow, а большинство других людей используют более гибкий объектно-ориентированный способ. Они запутаются и, скорее всего, перейдут к Сиборну и Плотли. Или, что еще хуже, без кода интерфейса Tableau, как я почти сделал. (Из-за этой путаницы я особенно помню, как просматривал темы Quora и StackOverflow, задаваясь вопросом, использовали ли люди Tableau вместо Matplotlib)

Эта статья познакомит вас с объектами фигур и осей в Matplotlib и их преимуществами перед другими методами.

Обзор

   I. Introduction
  II. Setup
 III. plt.subplots(), preliminary understanding
  IV. Axes methods vs. pyplot, understanding further
   V. plt.subplots() grid system
  VI. Doubling axis
 VII. Sharing a commong axis between subplots
VIII. Working with figure object
  IX. Conclusion

Образцы данных и блокнот статьи доступны в этом репозитории GitHub.

Настраивать

>>> climate_change.head()

plt.subplots (), предварительное понимание

Все начинается с вызова команды .subplots():

>>> plt.subplots()
(<Figure size 432x288 with 1 Axes>, <AxesSubplot:>)

Если вы обратите внимание, помимо пустого графика функция также вернула кортеж из двух значений:

[OUT]: (‹Рисунок размером 432x288 с 1 осью›, ‹AxesSubplot:›)

Каждый раз, когда мы вызываем функцию subplots(), она всегда возвращает эти типы кортежей с двумя значениями. В Python есть метод распаковки кортежей. Позвольте мне показать вам простой пример:

Если мы напечатаем значения трех вышеупомянутых:

>>> print(ten)
10
>>> print(eleven)
11
>>> print(twelve)
12

Отлично, мы распаковали кортеж размером 3 на три разные переменные. Итак, теперь вы лучше поймете этот код:

Мы создали две переменные, fig и ax. Помните, что это произвольные имена, но стандарт, и мы одни из хороших парней, поэтому мы будем следовать соглашению.

Эти две переменные теперь содержат два основных объекта, используемых для всех типов операций построения графиков. Первый объект fig, сокращение от figure, представьте его как рамку вашего сюжета. Вы можете изменять размер и форму рамки, но вы не можете рисовать на ней. В одной записной книжке или скрипте может быть несколько фигур. У каждого рисунка может быть несколько подсюжетов. Здесь подсюжет является синонимом осей. Второй объект, ax, сокращенно от оси, - это холст, на котором вы рисуете. Или, перефразируя, это чистый лист, на котором вы можете построить и хранить свои данные. Объект оси может принадлежать только одной фигуре.

Методы осей против pyplot, дальнейшее понимание

В начале поста я сказал, что pyplot был более удобным для новичков методом взаимодействия с Matplotlib. Это правда, что по сравнению с методами осей pyplot предлагает более быстрый и лаконичный метод построения. В нем будет меньше локальных переменных и синтаксиса. Но почему большинство людей предпочитают объектно-ориентированный подход?

Давайте посмотрим, как выглядит pyplot:

Что ж, это было легко. Нам потребовалось всего три строчки. Теперь давайте посмотрим, что произойдет, если мы попытаемся нанести (совершенно не связанные) данные об изменении климата рядом с ним:

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

У Mpl есть эта концепция под названием current figure. По умолчанию pyplot сама создает current figure оси и графики на ней. Если, например, мы хотим сосредоточиться на этом current figure и нанести на него дополнительные данные, как мы пытались в последнем примере, pyplot перемещает current figure на новый сразу после того, как дана новая команда построения.

Чтобы избежать этого, давайте посмотрим, как мы полностью контролируем каждую фигуру и оси:

Мы особо отмечаем, что работаем над этим fig объектом. Это означает, что любая команда построения, которую мы напишем, будет применена к объекту осей (ax), который принадлежит fig. Если мы не определим новую фигуру с помощью команды plt.subplots(), текущая figure будет переменной fig. Этот способ очень хорош, так как теперь мы можем создать столько осей или подзаголовков на одной фигуре и работать с ними.

С этого момента я буду использовать термины подзаголовок и оси как синонимы.

plt.subplots () сеточная система

Мы видели пример создания одного подзаговора. Давайте посмотрим, как можно создать больше в одной фигуре:

Помимо других параметров, .subplots() имеет два параметра для указания размера сетки. nrows и ncols используются для указания количества строк и столбцов, которые нам нужны соответственно. Если вы обратили внимание, теперь наша вторая переменная содержит не одну, а две оси. И теперь он указан как numpy.ndarray. Итак, мы должны распаковать или проиндексировать этот массив, чтобы использовать наши команды построения графика:

Совет от профессионала: обратите внимание на функцию fig.tight_layout() с padding, установленным на 3. Это даст второстепенным сюжетам немного передышки.

Эти два метода полностью схожи, и вы можете выбрать один из них. Давайте посмотрим еще один пример, но немного посложнее:

Совет от профессионала: правильно задайте аргумент figsize=(width, height). Это сделает ваши сюжеты более четкими.

Эта статья не о построении графиков в частности, а для того, чтобы дать вам интуитивное представление о фигурах и осях. Однако позвольте мне кратко рассказать вам о некоторых других распространенных методах для объекта axes:

Все методы, доступные в pyplot API, имеют эквивалент до ax.set_. Если вы используете общий метод ax.set(), вы избежите повторения при наличии нескольких подзаголовков. Однако, если вам нужно указать дополнительные параметры для определенных частей вашего графика, используйте ax.set_:

Двойная ось

Иногда нам нужно, чтобы в одном подзаголовке было более одного XAxis или YAxis. Хотя это невозможно с простым pyplot интерфейсом, это очень просто с figure объектно-ориентированным API верхнего уровня. Допустим, мы хотим построить столбцы relative_temp и co2 из climate_change на одном графике. Мы хотим, чтобы они делили XAxis, поскольку данные относятся к одному и тому же периоду времени:

Мы хотели иметь общий XAxis, то есть столбец date, поэтому мы создали другую ось, используя ax.twinx(). Если в некоторых случаях вам нужен общий YAxis, эквивалентная функция - ax.twiny().

Совместное использование общей оси между частями сюжета

Допустим, мы хотели сравнить выбросы CO2 в восьмидесятые и девяностые годы. В идеале мы хотели бы нанести восьмидесятые с одной стороны, а девяностые - с другой. Итак, давайте разберем наши данные за эти два периода времени:

Совет от профессионала: установите столбец даты в качестве индекса для фрейма данных, если вы работаете с данными временных рядов. Используйте метод .set_index() или параметр index_col в функции pd.read_csv(). Это значительно упростит подмножество для периодов времени.

Отлично, у нас есть два сюжета рядом, но если мы присмотримся, наши сюжеты вводят в заблуждение. Похоже, что не было большой разницы в выбросах CO2 за два периода времени. Причина этого в том, что два графика имеют разные YAxis диапазоны. Давайте настроим это правильно для лучшего понимания:

Теперь ясно, что выбросы CO2 продолжали расти с течением времени (сейчас они намного выше). Мы используем sharey=True, чтобы указать, что мы хотим одинакового YAxis для всех подзаголовков.

Работа с объектом-фигурой

Думаю, вы заметили, что как только вы создаете объект-фигуру с помощью команды .subplots() или других методов, почти все происходит с объектами осей. Одним из распространенных методов объекта figure является метод savefig(). Итак, приступим к изучению. Мы вернемся к нашему двухосному графику CO2. Сохраним в локальную память:

Мы передали имя файла в виде строки для сохранения. Это сохраняет изображение с этим именем в корневом каталоге. Возможные форматы изображений для использования:

  1. .png - если вы хотите, чтобы ваши фигурки были качественными и не заботились о месте на диске, используйте png. Этот формат допускает сжатие без потерь.
  2. .jpg - сжатие с потерями. jpg изображения будут иметь меньший размер, чем png с, и более низкое качество. Этот формат рекомендуется, если вы хотите загрузить изображения позже на веб-сайт или другими подобными способами.
  3. .svg - поддерживает анимацию и редактирование изображений. Используйте этот формат, если вы хотите изменить фигуры с помощью программного обеспечения для редактирования, такого как Adobe Illustrator.

Остальные параметры .savefig() позволяют контролировать качество ваших фигур:

Заключение

Надеюсь, что теперь у вас есть четкое представление о фигурах и осях. Мы рассмотрели только один из способов построения графика в Матплотлиб. Библиотека может быть настолько глубокой, насколько вы хотите, если хотите исследовать дальше. Подробнее о методах построения объектов фигуры и осей вы можете узнать в официальной документации Matplotlib. Я настоятельно рекомендую вам попробовать другие функции и попрактиковаться! (Кстати, на GitHub было много статей!)

Просмотрите другие мои обращения на Medium: