Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Линия уровня функции.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.04 Mб
Скачать

Линия уровня функции - это кривая, в каждой точке которой функция принимает одно и то же фиксированное значение.

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

  1. В виде трех двумерных матриц, описывающих двумерную сетку и значения функции в узлах этой сетки. В этом случае используются функции contour и contourf.

  2. В виде трех одномерных массивов, описывающих произвольно расположенные точки на плоскости и значения функции в этих точках. В этом случае используются функции tricontour и tricontourf.

Сначала рассмотрим случай, когда данные заданы в виде двумерных матриц. В этой статье мы будем рисовать линии уровня функции, заданной следующей формулой:

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

# -*- coding: utf-8 -*- import pylab from mpl_toolkits.mplot3d import Axes3D import numpy def makeData():     x = numpy.arange(-10, 10, 0.05)     y = numpy.arange(-10, 10, 0.05)     xgrid, ygrid = numpy.meshgrid(x, y)     zgrid = (numpy.sin(xgrid * 0.3) * numpy.cos(ygrid * 0.75) /              (1 + numpy.abs(xgrid * ygrid) * 0.05))     return xgrid, ygrid, zgrid if __name__ == '__main__':     x, y, z = makeData()     fig = pylab.figure()     axes = Axes3D(fig)     axes.plot_surface(x, y, z)     pylab.show()

Исходник

В трехмерном виде эта функция выглядит следующим образом:

Рисование линий уровня

Чтобы построить линии уровня по данным, которые заданы в виде трех двумерных матриц (по данным, расположенным в узлах прямоугольной сетки), можно воспользоваться функциями countour или contourf из модуля pylab. Отличие этих двух функций состоит в том, что contourf, в отличие от contour, закрашивает области между линиями уровня однотонным цветом. Эти функции имеют некоторое количество параметров для настройки внешнего вида графика, но для начала ими можно пренебречь и передать в функцию только данные, по которым нужно построить линии уровня. Например:

# -*- coding: utf-8 -*- import pylab import numpy def makeData():     x = numpy.arange(-10, 10, 0.05)     y = numpy.arange(-10, 10, 0.05)     xgrid, ygrid = numpy.meshgrid(x, y)     zgrid = (numpy.sin(xgrid * 0.3) * numpy.cos(ygrid * 0.75) /              (1 + numpy.abs(xgrid * ygrid) * 0.05))     return xgrid, ygrid, zgrid if __name__ == '__main__':     x, y, z = makeData()     pylab.contour(x, y, z)     pylab.show()

Исходник

Результат будет выглядеть следующим образом:

Если заменить функцию contour на contourf, то результат будет следующий:

# -*- coding: utf-8 -*- import pylab import numpy def makeData():     x = numpy.arange(-10, 10, 0.05)     y = numpy.arange(-10, 10, 0.05)     xgrid, ygrid = numpy.meshgrid(x, y)     zgrid = (numpy.sin(xgrid * 0.3) * numpy.cos(ygrid * 0.75) /              (1 + numpy.abs(xgrid * ygrid) * 0.05))     return xgrid, ygrid, zgrid if __name__ == '__main__':     x, y, z = makeData()     pylab.contourf(x, y, z)     pylab.show()

Исходник

Добавление подписей к линиям уровня

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

Функции contour / contourf возвращают объект типа QuadContourSet (это производный класс от более общего класса ContourSet), который описывает наш график. Чтобы добавить на график подписи для линий уровня, нужно вызвать функцию clabel из модуля pylab. Эта Функция в качестве первого параметра ожидает экземпляр класса ContourSet. Таким образом, функции clabel в качестве первого параметра можно передать экземпляр класса, который был возвращен из функций contour / contourf.

# -*- coding: utf-8 -*- import pylab import numpy def makeData():     x = numpy.arange(-10, 10, 0.05)     y = numpy.arange(-10, 10, 0.05)     xgrid, ygrid = numpy.meshgrid(x, y)     zgrid = (numpy.sin(xgrid * 0.3) * numpy.cos(ygrid * 0.75) /              (1 + numpy.abs(xgrid * ygrid) * 0.05))     return xgrid, ygrid, zgrid if __name__ == '__main__':     x, y, z = makeData()     cs = pylab.contour(x, y, z)     pylab.clabel(cs)     pylab.show()

Исходник

Результат выглядит следующим образом:

Такого же результата можно добиться, если использовать не функцию clabel из pylab, а одноименный метод из класса QuadContourSet, то есть в предыдущем примере заменить строку pylab.clabel(cs) на cs.clabel().

Строго говоря, метод clabel класс QuadContourSet наследует от своего прародителя - класса ContourLabeler, а общая иерархия классов выглядит следующим образом:

Полный список параметров функции clabel вы можете найти в документации, некоторые из них мы рассмотрим чуть позже в этой статье.