Использование библиотеки Matplotlib. Использование класса GridSpec для расположения графиков
В примере Более гибкий способ расположения графиков с помощью subplot2grid описывался более гибкий способ расположения графиков по сравнению с использованием функции subplot(). Пример из этой статьи показывает еще один способ способ размещения графиков в окне, при котором используется класс GridSpec.
Данный способ кажется более длинным, но зато он позволяет более наглядно описывать положения графиков в окне. Кроме того, он позволяет изменять размеры ячеек таблицы расположения графиков и имеет другие приятные возможности, что будет показано чуть позже.
Суть данного метода расположения графиков заключается в том, что сначала создается экземпляр класса GridSpec, описывающий таблицу, а затем в функцию subplot() передаются экземпляры класса SubplotSpec, которые получаются из экземпляров класса GridSpec с помощью оператора индексирования ([...]). Оператор индексирования при этом может быть как одномерным, так и двумерным, причем в качестве индексов для ячеек таблиц можно указывать не только один индекс, но и интервал, тогда график будет занимать несколько клеток.
Следующий пример создает окно, которое разбивается на виртуальную таблицу размером 4 x 4. Затем создаются графики, которые могут занимать не одну ячейку таблицы, а сразу несколько ячеек. Дальнейшие комментарии даны в тексте программы. Результат работы программы показан на скриншоте.
from matplotlib.gridspec import GridSpec
import matplotlib.pyplot as plt
import numpy as np
def plotGraph(title: str):
# Интервал изменения переменной по оси X
xmin = -20.0
xmax = 20.0
# Количество точек на графике
count = 200
# Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
x = np.linspace(xmin, xmax, count)
# Вычислим значение функции в заданных точках
y = np.sinc(x / np.pi)
plt.plot(x, y)
plt.text(-20, 0.9, title)
if __name__ == '__main__':
plt.figure(figsize=(10, 8))
# !!! Создаем таблицу (сетку) размером 4 x 4 ячеек
grid = GridSpec(4, 4)
# Одномерное индексирование.
# 0-я ячейка. Отсчет начинается левого верхнего угла
# График занимает одну ячейку
plt.subplot(grid[0])
plotGraph('Graph 1')
# Одномерное индексирование.
# 1-я ячейка. Отсчет начинается левого верхнего угла (0-ая строка, 1-ый столбец)
# График занимает одну ячейку
plt.subplot(grid[1])
plotGraph('Graph 2')
# Двумерное индексирование.
# 1-ая строка, 0-ой столбец
# График занимает одну ячейку
plt.subplot(grid[1, 0])
plotGraph('Graph 3')
# Двумерное индексирование.
# 0-я строка. График занимает столбцы от 2 и до конца строки (2:)
# График занимает одну строку и два столбца (2-й и 3-й)
plt.subplot(grid[0, 2:])
plotGraph('Graph 4')
# Двумерное индексирование.
# График занимает строки, начиная с 1 и до 2 включительно (1: 3)
# График занимает столбцы от 1 и до предпоследней ячейки включительно (1: -1)
# График занимает две строки и два столбца
plt.subplot(grid[1: 3, 1: -1])
plotGraph('Graph 5')
# Двумерное индексирование.
# График занимает строки, начиная со 2 и до конца всех строк (столбца) (2: )
# График занимает один столбец по горизонтали
# График занимает две строки и один столбец
plt.subplot(grid[2:, 0])
plotGraph('Graph 6')
# Двумерное индексирование.
# График занимает строки, начиная с 1 и до последней строки включительно (1:)
# График занимает один последний столбец (-1)
# График занимает две строки и один столбец
plt.subplot(grid[1:, -1])
plotGraph('Graph 7')
# Двумерное индексирование.
# График занимает одну последнюю строку (-1)
# График занимает два столбца: 1 и 2 (1: 3)
# График занимает одну строку и два столбца
plt.subplot(grid[-1, 1: 3])
plotGraph('Graph 8')
plt.show()
В следующем примере разберемся, как с помощью класса GridSpec сделать так, чтобы размеры строк и столбцов виртуальной таблицы для графиков были бы разных размеров. В комментариях описаны параметры width_ratios и height_ratios с помощью которых задаются соотношения столбцов и строк таблицы с графиками.
from matplotlib.gridspec import GridSpec
import matplotlib.pyplot as plt
import numpy as np
def plotGraph(title: str):
# Интервал изменения переменной по оси X
xmin = -20.0
xmax = 20.0
# Количество точек на графике
count = 200
# Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
x = np.linspace(xmin, xmax, count)
# Вычислим значение функции в заданных точках
y = np.sinc(x / np.pi)
plt.plot(x, y)
plt.text(-20, 0.85, title)
if __name__ == '__main__':
plt.figure(figsize=(10, 8))
# Создаем таблицу (сетку) с тремя строками и двумя столбцами
rows = 3
cols = 2
# !!! При создании сетки появились два новых параметра:
# !!! width_ratios - список соотношений ширин ячеек.
# !!! В данном случае ширина второго столбца будет в 1.5 раза больше первого
# !!! height_ratios - список соотношений высот ячеек
# !!! В данном случае высота второй строки будет в 2 раза больше первого,
# !!! а высота третьей строки будет в 3 раза больше первой (в 1.5 раза больше второй)
grid = GridSpec(rows, cols, width_ratios=[1, 1.5], height_ratios=[1, 2, 3])
for n in range(rows * cols):
plt.subplot(grid[n])
plotGraph('Graph {}'.format(n))
plt.show()
Также с помощью класса GridSpec можно изменять зазоры между графиками и отступы между графиками и границей окна. Следующий пример показывает, как можно изменить предыдущий код, чтобы графики занимали большую часть площади окна. Для этого используются параметры left, right, bottom и top, которые задают относительные положения границ таблицы с графиками. Более подробно они описаны в комментариях в коде.
В результате выполнения следующего кода будет показано окно, представленное ниже (сравните его с предыдущим скриншотом):
from matplotlib.gridspec import GridSpec
import matplotlib.pyplot as plt
import numpy as np
def plotGraph(title: str):
# Интервал изменения переменной по оси X
xmin = -20.0
xmax = 20.0
# Количество точек на графике
count = 200
# Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
x = np.linspace(xmin, xmax, count)
# Вычислим значение функции в заданных точках
y = np.sinc(x / np.pi)
plt.plot(x, y)
plt.text(-20, 0.85, title)
if __name__ == '__main__':
plt.figure(figsize=(10, 8))
# Создаем таблицу (сетку) с тремя строками и двумя столбцами
rows = 3
cols = 2
# !!! Параметры left, right и bottom, top задают
# !!! положение области графиков в окне.
# !!! Если left = 0.0, то таблица с графиками будет прижат к левой границе.
# !!! Если right = 1.0, то таблица с графиками будет растянута до правой границы.
# !!! Аналогично ведут себя параметры bottom и top, только применительно
# !!! к вертикальному размеру таблицы с графиками.
grid = GridSpec(rows, cols, width_ratios=[1, 1.5], height_ratios=[1, 2, 3],
left=0.05, right=0.98, bottom=0.05, top=0.98)
for n in range(rows * cols):
plt.subplot(grid[n])
plotGraph('Graph {}'.format(n))
plt.show()
Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.