Графики функций и поверхностей в Python Питон Matplotlib

16 января 2019 - Администратор

Построение графиков с помощью модуля Matplotlib в Python Питон.

В этом уроке мы разберём, как строить графики функций с помощью модуля Matplotlib в Python Питон.
Matplotlib это библиотека для Python, предназначенная для визуализации данных. В данном уроке мы разберём построение графиков функций в Питон на плоскости и построение поверхности в трёхмерном пространстве. Зачастую, именно Matplotlib используется в научных исследованиях и конференциях для демонстрации полученных данных.
Для построения графиков нужно импортировать модуль Pyplot. Pyplot это модуль для работы с графиками в Питоне. Pyplot это набор команд, созданных для построения графиков функций и уравнений. Для удобного построения графиков так же нужно использовать библиотеку NumPy.
Matplotlib, как и NumPy, встроен в среду разработки Spyder, поэтому их можно импортировать без предварительной установки.
import numpy as np
import matplotlib.pyplot as plt

as np и as plt означает, что когда мы будем вызывать функции и процедуры из модулей, вместо названия модулей мы будем использовать np и plt.
Для построения графика функции в Python нужно задать саму функцию. Её можно задать с помощью лямбда-функции. Лямбда-функция — это краткий способ записи обычной функции в одну строчку. В этом уроке мы рассмотрим построение синусоиды на Питоне. Синусоида задаётся функцией f(x) = sin(x).
y = lambda x: np.sin(x)
y это обозначение функции (для её вызова мы будем использовать y(x)), lambda это ключевое слово, обозначающее начало задания лямбда-функции, x это аргумент, использующийся в функции, после двоеточия задаётся функция. Так как в стандартном Python нет функции, возвращающей синус x, мы его задаём с помощью NumPy, его мы импортировали под именем np.
Все действия в Pyplot производятся на рисунках. Для построения графика функции в Python нужно создать рисунок. Рисунок fig создаётся с помощью plt.subplots().
fig = plt.subplots()

Мы должны определить область значений, на которой мы будем строить график функции в Питоне. Это делается с помощью linspace.
x = np.linspace(-3, 3, 100)
linspace создаёт массив с нижней границей -3 и верхней границей 3, в созданном массиве будет 100 элементов. Чем больше будет последнее число, тем больше значений функции будет рассчитываться, тем точнее будет отображаться график в Python.
После того, как мы создали рисунок и область построения, мы можем построить график в Питон. Для этого нужно использовать команду plt.plot(x, y(x)), где x это аргумент, y(x) это функция от x, заданная с помощью лямбда-выражения.
plt.plot(x, y(x))
После того, как мы нарисовали график в Python, нужно показать его на рисунке. Для этого используется plt.show().
Полный код программы.
# импортируем модули
import numpy as np
import matplotlib.pyplot as plt
# функция
y = lambda x: np.sin(x)
# создаём рисунок с координатную плоскость
fig = plt.subplots()
# создаём область, в которой будет
# - отображаться график
x = np.linspace(
# значения x, которые будут отображены
-3, 3,
# количество элементов в созданном массиве
# - качество прорисовки графика 
100)
# рисуем график
plt.plot(x, y(x))
# показываем график
plt.show()

В трёхмерном пространстве каждая точка задаётся тремя координатами, следовательно, в трёхмерном пространстве нужно два аргумента для задания функции. В этом уроке по Питону мы зададим функцию
f(x,y)=x^2-y^2
от двух аргументов. Аргументы x и y, функция z.
f = lambda x, y: x ** 2 - y ** 2
Процедура plt.figure принимает параметр figsize(x, y), где x и y – ширина и высота рисунка в дюймах. Создадим рисунок в Python размером 12×6 дюймов для отображения рисунка трёхмерного пространства с поверхностью и рисунка её проекции на плоскость, на которой будет отображены значения функции z.
fig = plt.figure(figsize = (12, 6))
В рисунке создадим ещё рисунок, в котором будут отображено трёхмерное пространство с координатными осями и сама поверхность. В Питоне для этого используется fig.add_subplot()
ax = fig.add_subplot(1, 2, 1, projection = '3d')
fig.add_subplot()
создаёт сетку с одной (1) строкой и двумя (2) столбцами для рисунков, в первый (1) столбец мы помещаем рисунок трёхмерного пространства, благодаря аргументу projection = ‘3d’ рисунок в Python будет изображать трёхмерное пространство.
Введём области отображения функции для каждого аргумента в Питон.
xval = np.linspace(-5, 5, 100)
yval = np.linspace(-5, 5, 100)

Нужно создать поверхность, которая будет отображаться на рисунке в Python. Для этого используется
surf = ax.plot_surface(x, y, z, rstride = 4, cstride = 4, cmap = cm.plasma)
Где x и y это принимаемые аргументы, z это получаемая функция, rstride и cstride отвечает за шаг прорисовки поверхности в Питон, чем меньше будут эти значения, тем более плавно будет выглядеть градиент на поверхности. С помощью cmap.plasma поверхность будет отображаться с цветовой схемой plasma. Например, существуют цветовые схемы, такие как viridis, inferno и magma. Полный список цветовых схем есть на сайте Matplotlib.
Чтобы добавить проекцию z на плоскость, нужно добавить второй рисунок. Он будет находиться в сетке такого же размера, но уже в втором столбце.
ax = fig.add_subplot(1, 2, 2)
Для отображения проекции значений z на плоскость в Питон используется
plt.contourf(x, y, z, 500, cmap=cm.plasma)
x, y это принимаемые аргументы, z это функция, значения которой будут отображаться на плоскости, число 500 отвечает за качество прорисовки градиента, чем больше это число, тем более точной будет проекция значений z на плоскость, проекция будет нарисована с использованием цветовой схемы plasma.
Проекция значений z на плоскость в Python будет отображена с помощью цветовой схемы без указания того, какой цвет соответствует какому значению. Чтобы исправить это, следует нарисовать шкалу значений в зависимости от цвета. 
В Питон для этого используется
fig.colorbar(surf, aspect = 20)
Программа в Python нарисует шкалу значений справа от проекции значений z, шкала будет нарисована для поверхности surf, созданной ранее, значение aspect отвечает за отношение высоты шкалы к её ширине, чем больше это значение, тем выше и тоньше будет шкала, чем меньше будет это значение, тем ниже и толще будет шкала.
Построение поверхности в трёхмерном пространстве.
# импортируем модули
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import cm
import matplotlib.pyplot as plt
# уравнение поверхности
f = lambda x, y: x ** 2 - y ** 2
# создаём полотно для рисунка
fig = plt.figure(figsize = (12, 6))
# создаём рисунок пространства с поверхностью
ax = fig.add_subplot(1, 2, 1, projection = '3d')
# размечаем границы осей для аргументов
xval = np.linspace(-5, 5, 100)
yval = np.linspace(-5, 5, 100)
# создаём массив с xval столбцами и yval строками
# - в этом массиве будут храниться значения z
x, y = np.meshgrid(xval, yval)
# приравниваем z к функции от x и y 
z = f(x, y)
# создаём поверхность
surf = ax.plot_surface(
# отмечаем аргументы и уравнение поверхности
x, y, z, 
# шаг прорисовки сетки
# - чем меньше значение, тем плавнее
# - будет градиент на поверхности
rstride = 4,
cstride = 4,
# цветовая схема plasma
cmap = cm.plasma)
# добавляем проекцию z на плоскость
ax = fig.add_subplot(1, 2, 2)
# рисуем проекцию z
plt.contourf(
# отмечаем аргументы и уравнение поверхности
x, y, z, 
# уровень прорисовки проекции -
# - чем больше, тем плавнее градиент
500,
# используем цветовую схему plasma
cmap=cm.plasma)
# рисуем шкалу справа от проекции
fig.colorbar(
# выбираем созданную поверхность
surf,
# отношение высоты шкалы к её ширине
aspect = 20)

Вернуться к содержанию Следующая тема Классы в Питон

Комментарии (0)

Нет комментариев. Ваш будет первым!