Использование библиотеки Matplotlib. Как рисовать графики в разных окнах

В статье Как нарисовать несколько графиков в одном окне описывалось, как можно рисовать несколько графиков в одном окне. На этот раз мы разберемся, как можно рисовать графики в разных окнах. Для этого перед выводом очередного графика нужно вызвать функцию figure() из пакета matplotlib.pyplot, а в качестве первого параметра передать целочисленный идентификатор окна, в который мы хотим поместить график. Если окна с таким идентификатором до этого не было, то оно будет создано. Если же окно с таким идентификатором уже есть, то оно станет "активным", и в дальнейшем все функции рисования будут применяться уже к нему.

Рассмотрим пример, в котором мы поочередно добавляем графики то в одно окно, то в другое:

# coding: utf-8

import matplotlib.pyplot as plt
import numpy as np


if __name__ == '__main__':
    # Интервал изменения переменной по оси X и количество точек на этом интервале
    xmin = -20.0
    xmax = 20.0
    count = 200

    # Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
    x = np.linspace(xmin, xmax, count)

    # Вычислим значение функции в заданных точках
    y1 = np.sinc(x / np.pi)
    y2 = np.sinc(x / np.pi * 0.2)
    y3 = np.sinc(x / np.pi * 2.0)

    # !!! Нарисуем график в первом окне
    plt.figure(1)
    plt.plot(x, y1, label="f(x)")

    # !!! Нарисуем график во втором окне
    plt.figure(2)
    plt.plot(x, y2, label="f(x * 0.2)")
    plt.legend()

    # !!! Нарисуем еще один график в первом окне
    plt.figure(1)
    plt.plot(x, y3, label="f(x * 2)")
    plt.legend()

    # Покажем окна с нарисованными графиками
    plt.show()

В результате у нас будет два окна со следующим содержимым:

Этот код можно переписать в более объектно-ориентированном стиле. Дело в том, что функция figure() возвращает экземпляр класса Figure, из которого можно получить доступ к осям или создать их (класс Axes), а затем рисовать графики, используя методы из класса Axes.

Создание осей для графика будет выглядеть примерно так:

fig1 = plt.figure(1)
axes1 = fig1.subplots()

Если методу subplots не передавать параметры, то созданные оси будут занимать все окно. Это равносильно вызову axes1 = fig1.subplots(1, 1). А вообще первые два параметра метода subplots() аналогичны первым двум параметрам из функции subplot(), которая используется для разбиения окна на несколько графиков. Если окно разбивается на несколько осей, то функция возвращает массив из экземпляров класса Axes (этот массив может быть двумерным, если окно разбивается на двумерную таблицу).

Следующий код показывает пример использования метода subplots(). Результат выполнения этого скрипта не будет отличаться от предыдущего.

# coding: utf-8

import matplotlib.pyplot as plt
import numpy as np


if __name__ == '__main__':
    # Интервал изменения переменной по оси X и количество точек на этом интервале
    xmin = -20.0
    xmax = 20.0
    count = 200

    # Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
    x = np.linspace(xmin, xmax, count)

    # Вычислим значение функции в заданных точках
    y1 = np.sinc(x / np.pi)
    y2 = np.sinc(x / np.pi * 0.2)
    y3 = np.sinc(x / np.pi * 2.0)

    # !!! Нарисуем график в первом окне
    fig1 = plt.figure(1)
    axes1 = fig1.subplots(1, 1)
    axes1.plot(x, y1, label='f(x)')

    # !!! Нарисуем график во втором окне
    fig2 = plt.figure(2)
    axes2 = fig2.subplots()
    axes2.plot(x, y2, label='f(x * 0.2)')
    axes2.legend()

    # !!! Нарисуем еще один график в первом окне
    axes1.plot(x, y3, label='f(x * 2)')
    axes1.legend()

    # Покажем окна с нарисованными графиками
    plt.show()

Создание окна (фигуры) и осей можно объединить в один вызов. Для этого в модуле matplotlib.pyplot существует функция subplots(), аналогичная одноименному методу из класса Figure, но при этом создающая одновременно и окно, и оси. Эта функция возвращает кортеж, состоящий из экземпляра класса Figure и экземпляра (или экземпляров) класса Axes.

То есть с использованием функции subplots() создание окна и осей будет выглядеть примерно так: fig, axes = plt.subplots(). Следующий код демонстрирует использование такого способа создания окон.

# coding: utf-8

import matplotlib.pyplot as plt
import numpy as np


if __name__ == '__main__':
    # Интервал изменения переменной по оси X и количество точек на этом интервале
    xmin = -20.0
    xmax = 20.0
    count = 200

    # Создадим список координат по оси X на отрезке [xmin; xmax], включая концы
    x = np.linspace(xmin, xmax, count)

    # Вычислим значение функции в заданных точках
    y1 = np.sinc(x / np.pi)
    y2 = np.sinc(x / np.pi * 0.2)
    y3 = np.sinc(x / np.pi * 2.0)

    # !!! Создадим окна и оси в них
    fig1, axes1 = plt.subplots(1, 1)
    fig2, axes2 = plt.subplots()

    # !!! Нарисуем график в первом окне
    axes1.plot(x, y1, label='f(x)')

    # !!! Нарисуем график во втором окне
    axes2.plot(x, y2, label='f(x * 0.2)')
    axes2.legend()

    # !!! Нарисуем еще один график в первом окне
    axes1.plot(x, y3, label='f(x * 2)')
    axes1.legend()

    # Покажем окна с нарисованными графиками
    plt.show()

Внешне результат работы этого скрипта выглядит так же, как и результат выполнения предыдущих скриптов - будет создано два окна с разными графиками.

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

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

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




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