Узнайте об объектах фигур и осей в 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. Сохраним в локальную память:
Мы передали имя файла в виде строки для сохранения. Это сохраняет изображение с этим именем в корневом каталоге. Возможные форматы изображений для использования:
.png
- если вы хотите, чтобы ваши фигурки были качественными и не заботились о месте на диске, используйтеpng
. Этот формат допускает сжатие без потерь..jpg
- сжатие с потерями.jpg
изображения будут иметь меньший размер, чемpng
с, и более низкое качество. Этот формат рекомендуется, если вы хотите загрузить изображения позже на веб-сайт или другими подобными способами..svg
- поддерживает анимацию и редактирование изображений. Используйте этот формат, если вы хотите изменить фигуры с помощью программного обеспечения для редактирования, такого как Adobe Illustrator.
Остальные параметры .savefig()
позволяют контролировать качество ваших фигур:
Заключение
Надеюсь, что теперь у вас есть четкое представление о фигурах и осях. Мы рассмотрели только один из способов построения графика в Матплотлиб. Библиотека может быть настолько глубокой, насколько вы хотите, если хотите исследовать дальше. Подробнее о методах построения объектов фигуры и осей вы можете узнать в официальной документации Matplotlib. Я настоятельно рекомендую вам попробовать другие функции и попрактиковаться! (Кстати, на GitHub было много статей!)
Просмотрите другие мои обращения на Medium: