Визуализация функций в Matplotlib 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Визуализация функций в Matplotlib



Визуализация функции f(x) состоит в том, чтобы нарисовать кривую y = f(x) в системе координат Оxy. Технически это заключается в проведении прямых линий между точками, заданными значениями функции. Чем больше точек мы берем, тем более гладкой получается кривая.

Предположим, мы хотим изобразить функцию f(x) для a < x < b. Сначала мы должны задать n координат в интервале [a, b], которые мы назовем x0,x1,…,xn−1. Затем мы вычисляем yi=f(xi). Далее, если мы расположим значения xi и yi соответственно в массивах x и y, мы можем начертить график с помощью команды plot(x, y).

Естественно, имена функции и аргумента могут быть другими. В нашем первом примере о графиках мы будем рисовать кривую для функции от времени t.

Matplotlib

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

НАБОР ТОЧЕК


График, полученный в примере 1

Одним из больших преимуществ Matplotlib является та скорость, с которой мы можем построить график и привести первый пример:

>>> import matplotlib.pyplot as plt
>>> plt.plot([1, 3, 2, 4])
[<matplotlib.lines.Line2D object at 0x01A00430>]
>>> plt.show()

После выполнения последней строчки, вызывается окно Matplotlib, внутри которого мы видим рисунок, показанный справа, который мы можем сохранить в удобном формате с помощью крайней правой иконки в нижней панели, например, обычном графическом формате PNG. Что же мы построили?

В первой инструкции мы импортировали основной модуль библиотеки для построения графиков под именем plt, именно так наиболее часто сокращается это длинное имя. Мы не используем импортирование всех функций через *, поскольку, во-первых это долго, во-вторых сильно захламляет пространство имен. Поэтому пользуемся коротким префиксом. После того, как мы импортировали модуль, мы можем пользоваться его функциями, здесь мы использовали функцию plot(), которая собственно и строит график, а потом функция show() его нам показывает.

Аргумент, принимаемый функцией plot() это последовательность y-значений. Другой, который мы опустили, стоящий перед y — это последовательность x-значений. Поскольку его нет, генерируется для четырех указанных y, список из четырех x: [0, 1, 2, 3]. Отсюда и такой график.

ФУНКЦИЯ

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

from numpy import *
import matplotlib.pyplot as plt
def f(t):
return t**2*exp(-t**2)

t = linspace(0, 3, 51) # 51 точка между 0 и 3
y = f(t) plt.plot(t, y)
plt.show()

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

from numpy import *
import matplotlib.pyplot as plt
t = linspace(0, 3, 51)
y = t**2*exp(-t**2)
plt.plot(t, y)
plt.show()

УКРАШЕНИЯ


Кроме того, чтобы просто построить кривую, было бы хорошо её назвать, обозначить оси, вывести легенду (это особенно пригодится, когда мы научимся строить несколько графиков. Кроме того, нам может захотеться изменить вид самой кривой, пределы, в которых мы ее смотрим. И все это c matplotlib, конечно, возможно:

from numpy import *
import matplotlib.pyplot as plt
t = linspace(0, 3, 51)
y = t**2*exp(-t**2)
plt.plot(t, y, 'g--', label='t^2*exp(-t^2)')
plt.axis([0, 3, -0.05, 0.5]) # задание [xmin, xmax, ymin, ymax] plt.xlabel('t') # обозначение оси абсцисс
plt.ylabel('y') # обозначение оси ординат
plt.title('My first normal plot') # название графика

plt.legend() # вставка легенды (текста в label)

plt.show()

Кроме отмеченных новшеств, обозначенных в комментариях, в аргументах функции plot() мы видим два новых. Последний задает текст легенды графика. Строковый аргумент "g--" и ответственен за то, что изменился вид кривой. В сравнении с предыдущим примером, график позеленел (green) и вырисовывается штриховой линией. По умолчанию этот аргумент b, что и означает синюю (blue) сплошную линию. Ниже приведена таблица, которая позволяет выбрать нужный аргумент.

b, blue синий
c, cyan голубой
g, green зеленый
k, black черный
m, magenta пурпурный
r, red красный
w, white белый
y, yellow желтый
- сплошная
-- штриховая
-. штрих-пунктир

НЕСКОЛЬКО КРИВЫХ

Часто встречаются задачи, в которых мало визуализировать какую-то функцию, нужно и сравнить ее с другой функцией или даже несколькими. Давайте сравним уже знакомую нам функцию y(t)=t2exp(−t2) с некоторой похожей функцией, например, y(t)=t4exp(−t2). Оказывается, что для этого достаточно добавить еще одну инструкцию plot():

from numpy import *

import matplotlib.pyplot as plt

t = linspace(0, 3, 51)

y1 = t**2*exp(-t**2)

y2 = t**4*exp(-t**2)

plt.plot(t, y1, label='t^2*exp(-t^2)')

plt.plot(t, y2, label='t^4*exp(-t^2)') # декоративная часть plt.xlabel('t')

plt.ylabel('y')

plt.title('Plotting two curves in the same plot')

plt.legend()

plt.show()

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


from numpy import *
import matplotlib.pyplot as plt
t = linspace(0, 3, 51)
y1 = t**2*exp(-t**2)
y2 = t**4*exp(-t**2)
y3 = t**6*exp(-t**2)
plt.plot(t, y1, 'g^', # маркеры из зеленых треугольников

t, y2, 'b--', # синяя штриховая
t, y3, 'ro-') # красные круглые маркеры,
# соединенные сплошной линией
plt.xlabel('t')
plt.ylabel('y')
plt.title('Plotting with markers')
plt.legend(['t^2*exp(-t^2)', 't^4*exp(-t^2)',

't^6*exp(-t^2)'], # список легенды

loc='upper left') # положение легенды plt.show()

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

Место String Code
лучший вариант best  
вверху справа upper right  
вверху слева upper left  
внизу слева lower left  
внизу справа lower right  
справа right  
посередине слева center left  
посередине справа center right  
посередине внизу lower center  
посередине вверху upper center  
посередине center  

МАРКЕРЫ

Здесь также показано как можно объединять сразу три графика в одной инструкции. Кроме того, видно, что можно не только использовать маркеры (y1) или линии(y2), но и объединять их вместе (y3). Наиболее часто в научных исследованиях и журналах приводят графики, отличаемые друг от друга именно по маркерам, поэтому и в matplotlib для их обозначения имеется множество способов:
. точечный маркер
, точки, размером с пиксель
o круги
v треугольники носом вниз
^ треугольники носом вверх
> треугольники смотрят вправо
< треугольники смотрят влево
s квадраты
p пентагоны
∗ звездочки
h шестиугольники
H повернутые шестиугольники
+ плюсы
x крестики
D ромбы
d узкие ромбы
| вертикальные засечки



Поделиться:


Последнее изменение этой страницы: 2017-02-19; просмотров: 516; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.135.213.214 (0.006 с.)