Использование библиотеки Matplotlib. Использование класса GridSpec для расположения графиков

В примере Более гибкий способ расположения графиков с помощью subplot2grid описывался более гибкий способ расположения графиков по сравнению с использованием функции subplot(). Пример из этой статьи показывает еще один способ способ размещения графиков в окне, при котором используется класс GridSpec.

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

Суть данного метода расположения графиков заключается в том, что сначала создается экземпляр класса GridSpec, описывающий таблицу, а затем в функцию subplot() передаются экземпляры класса SubplotSpec, которые получаются из экземпляров класса GridSpec с помощью оператора индексирования ([...]). Оператор индексирования при этом может быть как одномерным, так и двумерным, причем в качестве индексов для ячеек таблиц можно указывать не только один индекс, но и интервал, тогда график будет занимать несколько клеток.

Следующий пример создает окно, которое разбивается на виртуальную таблицу размером 4 x 4. Затем создаются графики, которые могут занимать не одну ячейку таблицы, а сразу несколько ячеек. Дальнейшие комментарии даны в тексте программы. Результат работы программы показан на скриншоте.

# coding: utf-8

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 с помощью которых задаются соотношения столбцов и строк таблицы с графиками.

# coding: utf-8

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, которые задают относительные положения границ таблицы с графиками. Более подробно они описаны в комментариях в коде.

В результате выполнения следующего кода будет показано окно, представленное ниже (сравните его с предыдущим скриншотом):

# coding: utf-8

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

Другие статьи про Matplotlib

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 5.0/5. Всего 2 голос(а, ов)




Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 561