Шаг 26.
Язык Python. Визуализация данных.
Библиотека Matplotlib. Компоновка графиков. Инструмент GridSpec

    На этом шаге мы рассмотрим примеры использования этого элемента.

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

Инструмент GridSpec

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

  import matplotlib.gridspec as gridspec

    Для начала решим простую задачу отображения двух полей с графиками с использованием GridSpec:

import matplotlib.pyplot as plt
import matplotlib.gridspec as 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(ncols=2, nrows=1, figure=fg)

plt.show()
Архив с файлом можно взять здесь.

    Результат работы приложения изображен на рисунке 1.


Рис.1. Два поля с графиками

    В конструктор класса передаётся количество столбцов (2), строк (1) и фигура (fg), на которой все будет отображено.

    Альтернативный вариант создания объекта GridSpec выглядит так:

  gs = fg.add_gridspec(1, 2)

    Здесь fg - это объект Figure, у которого есть метод add_gridspec(), позволяющий добавить на него сетку с заданными параметрами (в нашем случае одна строка и два столбца).

    Для задания элементов сетки, на которых будет расположено поле с графиком, GridSpec позволяет использовать синтаксис подобный тому, что применяется для построения слайсов в Numpy. Добавим ещё один набор данных к уже существующему и построим графики в новой компоновке:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

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)

plt.show()
Архив с файлом можно взять здесь.

    Результат работы приложения изображен на рисунке 2.


Рис.2. Свободная компоновка (пример 1)

    Конструкция [0, :] говорит о том, что первый график начинается с ячейки 0 и до конца текущей строки; [1, 0] - ячейка с номером 0 в 1-й строке и т.д.

    Ниже представлен ещё один пример без данных (с пустыми полями), который иллюстрирует возможности GridSpec:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

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:]')

plt.show()
Архив с файлом можно взять здесь.

    Результат работы приложения изображен на рисунке 3.


Рис.3. Свободная компоновка (пример 2)

    Можно заранее задать размеры областей и передать их в качестве параметров в виде массивов:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

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')

plt.show()
Архив с файлом можно взять здесь.

    Результат работы приложения изображен на рисунке 4.


Рис.4. Свободная компоновка (пример 3)

    Теперь вы можете создавать компоновки практически любой сложности.

    Со следующего шага мы начнем рассматривать текстовые элементы графика.




Предыдущий шаг Содержание Следующий шаг