Самые простые и наиболее часто используемые варианты компоновки графиков были рассмотрены в “Matplotlib. Урок 2. Работа с инструментом pyplot”. В этом уроке мы рассмотрим инструмент GridSpec, позволяющий более тонко настроить компоновку.
Инструмент GridSpec
Начнем наше знакомство с класса GridSpec, который позволяет задавать геометрию сетки и расположение на ней полей с графиками. На первый взгляд может показаться, что работа с GridSpec довольно неудобна и требует написания лишнего кода, но если требуется расположить поля с графиками нетривиальным образом, то этот инструмент становится незаменимым.
Перед тем как работать с GridSpec импортируйте его:
import matplotlib.gridspec as gridspec
Для начала решим простую задачу отображения двух полей с графиками с использованием GridSpec:
x = [1, 2, 3, 4, 5] y1 = [9, 4, 2, 4, 9] y2 = [1, 7, 6, 3, 5] fg = plt.figure(figsize=(7, 3), constrained_layout=True) gs = gridspec.GridSpec(ncols=2, nrows=1, figure=fg) fig_ax_1 = fg.add_subplot(gs[0, 0]) plt.plot(x, y1) fig_ax_2 = fg.add_subplot(gs[0, 1]) plt.plot(x, y2)
Объект класса GridSpec создается в строке:
gridspec.GridSpec(ncols=2, nrows=1, figure=fg)
В конструктор соответствующего класса передается количество столбцов, строк и Фигура, на которой все будет отображено.
Альтернативный вариант создания объекта GridSpec выглядит так:
gs = fg.add_gridspec(1, 2)
Здесь fg – это объект Figure, у которого есть метод add_gridspec(), позволяющий добавить на него сетку с заданными параметрами (в нашем случае одна строка и два столбца).
При задании элементов сетки, на которых будет расположено поле с графиком, GridSpec позволяет использовать синтаксис подобный тому, что применяется для построения слайсов в Numpy.
Добавим еще один набор данных к уже существующему:
x = [1, 2, 3, 4, 5] y1 = [9, 4, 2, 4, 9] y2 = [1, 7, 6, 3, 5] y3 = [-7, -4, 2, -4, -7]
Построим графики в новой компоновке:
fg = plt.figure(figsize=(9, 4), constrained_layout=True) gs = fg.add_gridspec(2, 2) fig_ax_1 = fg.add_subplot(gs[0, :]) plt.plot(x, y2) fig_ax_2 = fg.add_subplot(gs[1, 0]) plt.plot(x, y1) fig_ax_3 = fg.add_subplot(gs[1, 1]) plt.plot(x, y3)
Ниже представлен еще один пример, без данных (с пустыми полями), который иллюстрирует возможности данного подхода к компоновке:
fg = plt.figure(figsize=(9, 9), constrained_layout=True) gs = fg.add_gridspec(5, 5) fig_ax_1 = fg.add_subplot(gs[0, :3]) fig_ax_1.set_title('gs[0, :3]') fig_ax_2 = fg.add_subplot(gs[0, 3:]) fig_ax_2.set_title('gs[0, 3:]') fig_ax_3 = fg.add_subplot(gs[1:, 0]) fig_ax_3.set_title('gs[1:, 0]') fig_ax_4 = fg.add_subplot(gs[1:, 1]) fig_ax_4.set_title('gs[1:, 1]') fig_ax_5 = fg.add_subplot(gs[1, 2:]) fig_ax_5.set_title('gs[1, 2:]') fig_ax_6 = fg.add_subplot(gs[2:4, 2]) fig_ax_6.set_title('gs[2:4, 2]') fig_ax_7 = fg.add_subplot(gs[2:4, 3:]) fig_ax_7.set_title('gs[2:4, 3:]') fig_ax_8 = fg.add_subplot(gs[4, 3:]) fig_ax_8.set_title('gs[4, 3:]')
Можно заранее задаться размерами областей и передать их в качестве параметров в виде массивов:
fg = plt.figure(figsize=(5, 5),constrained_layout=True) widths = [1, 3] heights = [2, 0.7] gs = fg.add_gridspec(ncols=2, nrows=2, width_ratios=widths, height_ratios=heights) fig_ax_1 = fg.add_subplot(gs[0, 0]) fig_ax_1.set_title('w:1, h:2') fig_ax_2 = fg.add_subplot(gs[0, 1]) fig_ax_2.set_title('w:3, h:2') fig_ax_3 = fg.add_subplot(gs[1, 0]) fig_ax_3.set_title('w:1, h:0.7') fig_ax_4 = fg.add_subplot(gs[1, 1]) fig_ax_4.set_title('w:3, h:0.7')
Информации из данного урока и из “Matplotlib. Урок 2. Работа с инструментом pyplot” должно быть достаточно, для того чтобы создавать компоновки практически любой сложности.
P.S.
Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта. Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.