Использование библиотеки Matplotlib. Применение объектно-ориентированного стиля
Дата публикации: 18.12.2014
Дата последней правки: 11.10.2023
Содержание
- Модуль pylab. Историческая справка
- Модуль matplotlib.pyplot
- Используем объекты
- Похожие статьи
- Комментарии
Модуль pylab. Историческая справка
Matplotlib разрабатывается уже на протяжении долгого времени, и поэтому в недрах этой библиотеки можно найти следы различных исторических эпох в развитии этой библиотеки. Например, в древности Matplotlib использовалась через модуль pylab, который предоставляет функции по внешнему виду напоминающие функции из Matlab. На сайте Matplotlib до сих пор можно найти следы древних строк документации, рассказывающие о том, что когда-то подразумевалось, что программисты будут импортировать этот модуль через команду from pylab import *, чтобы импортировать множество функций, похожих на функции Matlab, причем эти функции относятся не только к построению графиков, но также туда входят различные математические функции из библиотек numpy, numpy.fft и numpy.linalg. Понятно, что в современном мире в приличной компании подобный импорт библиотек, мягко говоря, не поощряется, и поэтому модуль pylab сейчас считается устаревшим и оставлен только для обратной совместимости с древними письменами программами.
В качестве исторической справки приведем пример программы, использующей такой подход. Внимание!!! Сейчас так делать не надо!
- # -*- coding: utf-8 -*-
- from pylab import *
- if __name__ == "__main__":
- x = arange(0.0, 4 * pi, 0.01)
- y = sin(x) * cos(3 * x)
- figure()
- plot(x, y, "-k", label="y = f(x)")
- grid()
- xlim([0, 14])
- ylim([-2, 2])
- xlabel("t, нс")
- ylabel("U, В")
- title("Периодический сигнал")
- legend(title="Сигналы")
- show()
В результате с помощью этого кода мы рисуем одну кривую, включаем сетку, меняем пределы по оси Y, отображаем легенду и показываем окно. Результат выглядит следующим образом:
Модуль matplotlib.pyplot
Предыдущий пример, конечно компактный и может понравится тем, кто переходит с Matlab на Python, но не выдерживает никакой критики с точки зрения идеологии современного программирования. Поэтому через какое-то время в Matplotlib появился отдельный модуль matplotlib.pyplot, в котором были собраны аналогичные функции создания графиков, как и в pylab, но этот модуль не подразумевает импорт функций с помощью звездочки. Кроме того, в отличие от модуля pylab, модуль pyplot не содержит в себе функции из numpy, и поэтому их нужно импортировать в явном виде.
При импорте этого модуля принято давать ему псевдоним plt:
Теперь предыдущий пример должен выглядеть следующим образом:
import matplotlib.pyplot as plt
if __name__ == "__main__":
x = np.arange(0.0, 4 * np.pi, 0.01)
y = np.sin(x) * np.cos(3 * x)
plt.figure()
plt.plot(x, y, "-k", label="y = f(x)")
plt.grid()
plt.xlim([0, 14])
plt.ylim([-2, 2])
plt.xlabel("t, нс")
plt.ylabel("U, В")
plt.title("Периодический сигнал")
plt.legend(title="Сигналы")
plt.show()
Используем объекты
Хотя в предыдущих примерах мы нигде не использовали какие-либо классы из Matplotlib, а только вызывали функции, нужно понимать, что Matplotlib - это объектно-ориентированная библиотека, и мы можем получить доступ к ее внутренним объектам. Большинство функций, которые связаны с созданием графиков, возвращают какие-либо объекты. Это могут быть объекты, связанные с окном, где создаются графики (класс Figure), объекты осей (класс Axes), объекты кривых на графике (класс Line2D), класс легенды (Legend) и др.
Например, используемая в предыдущем примере функция plt.figure() возвращает экземпляр класса Figure, упомянутый выше. Мы можем воспользоваться этим и создать новые оси для графика с помощью метода add_subplot() из класса Figure, и этот метод нам вернет экземпляр класса Axes, используя который мы можем нарисовать график и настроить его внешний вид. Изменим для этого предыдущий пример.
- import numpy as np
- import matplotlib.pyplot as plt
- if __name__ == "__main__":
- x = np.arange(0.0, 4 * np.pi, 0.01)
- y = np.sin(x) * np.cos(3 * x)
- # Получим экземпляр класса Figure
- fig = plt.figure()
- print(type(fig))
- # Получим экземпляр класса осей Axes
- axes = fig.add_subplot(1, 1, 1)
- print(type(axes))
- # Получим список новых кривых
- curves = axes.plot(x, y, "-k", label="y = f(x)")
- print(curves)
- # Изменим настройки осей
- axes.grid()
- axes.set_xlim(0, 14)
- axes.set_ylim(-2.0, 2.0)
- axes.set_xlabel("t, нс")
- axes.set_ylabel("U, В")
- title = axes.set_title("Периодический сигнал")
- print(type(title))
- # Создадим легенду и получим экземпляр класса Legend
- legend = axes.legend()
- print(type(legend))
- # Изменим заголовок легенды
- legend.set_title("Сигналы")
- # Показать окно с графиком
- plt.show()
Этот пример последовательно выводит названия типов классов, которые мы получаем при вызове той или иной функции (или метода другого класса). В результате в консоль будут выведены следующие строки:
<class 'matplotlib.axes._axes.Axes'>
[<matplotlib.lines.Line2D object at 0x7f8f8a9e6dd0>]
<class 'matplotlib.text.Text'>
<class 'matplotlib.legend.Legend'>
- Функция plt.figure() возвращает экземпляр класса matplotlib.figure.Figure.
- Метод Figure.add_subplot() возвращает экземпляр класса matplotlib.axes._axes.Axes.
- Метод Axes.plot() возвращает список (состоящий из одного элемента в нашем примере) классов matplotlib.lines.Line2D.
- Метод Axes.set_title() возвращает экземпляр класса matplotlib.text.Text.
- Метод Axes.legend() возвращает экземпляр класса matplotlib.legend.Legend.
Обратите внимание, что методы классов очень напоминают функции модуля matplotlib.pyplot (и pylab), возможно с приставками set_ или get_. Например, matplotlib.pyplot.xlim() и Axes.set_ylim(), matplotlib.pyplot.xlabel() и Axes.set_xlabel() и т.п.
В предыдущем примере мы могли бы переписать строку создания кривых на графике (curves = axes.plot(x, y, "-k", label="y = f(x)")) по-другому, устанавливая параметры кривой в несколько этапов через методы класса Line2D. Это показано в следующем примере:
- import numpy as np
- import matplotlib.pyplot as plt
- if __name__ == "__main__":
- x = np.arange(0.0, 4 * np.pi, 0.01)
- y = np.sin(x) * np.cos(3 * x)
- # Получим экземпляр класса Figure
- fig = plt.figure()
- print(type(fig))
- # Получим экземпляр класса осей Axes
- axes = fig.add_subplot(1, 1, 1)
- print(type(axes))
- # Получим список новых кривых
- curves = axes.plot(x, y)
- print(curves)
- # !!! Изменим внешний вид кривой
- curves[0].set_linestyle("-")
- curves[0].set_color("k")
- curves[0].set_label("y = f(x)")
- # Изменим настройки осей
- axes.grid()
- axes.set_xlim(0, 14)
- axes.set_ylim(-2.0, 2.0)
- axes.set_xlabel("t, нс")
- axes.set_ylabel("U, В")
- title = axes.set_title("Периодический сигнал")
- print(type(title))
- # Создадим легенду и получим экземпляр класса Legend
- legend = axes.legend()
- print(type(legend))
- # Изменим заголовок легенды
- legend.set_title("Сигналы")
- # Показать окно с графиком
- plt.show()
Результат будет выглядеть точно также.
Таким образом при использовании библиотеки Matplotlib у нас есть выбор, при создании графиков использовать функции из модуля matpltolib.pyplot или использовать создаваемые объекты напрямую. Второй способ во многих ситуациях дает большую гибкость в настройке внешнего вида полученных графиков.
Похожие статьи
- Другие статьи про Matplotlib
- Как рисовать графики вида y = f(x)
- Как добавить легенду к графику
- Создание интерфейса средствами библиотеки Matplotlib
Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.