Графики функций и поверхностей в Python Питон Matplotlib
Построение графиков с помощью модуля 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 нужно сначала задать сетку координат. Сетка координат в python задается с помощью команды plt.subplots().
fig = plt.subplots()
Мы должны определить область значений, на которой мы будем строить график функции в Питоне. Это делается с помощью linspace .
x = np.linspace(-3, 3, 100)
linspace создаёт массив с нижней границей -3 и верхней границей 3 , в созданном массиве будет 100 элементов. Чем больше будет последнее число, тем больше значений функции будет рассчитываться, тем точнее будет отображаться график в Python.
После того, как мы создали систему координат, область построения, мы можем построить график в Питон. Для построения графика фуекции в Python нужно использовать команду plt.plot(x, y(x)) , где x это аргумент, y(x) это функция от x , заданная с помощью лямбда-выражения.
plt.plot(x, y(x))
После того, как мы построили график в Python, нужно показать его на рисунке. Для этого используется plt.show() .
Полный код программы на python для рисования графика функции
# импортируем модули
import numpy as np
import matplotlib.pyplot as plt
# функция
y = lambda x: np.sin(x)
# создаём рисунок с координатную плоскость
fig = plt.subplots()
# создаём область, в которой будет
# — отображаться график
x = np.linspace( -3, 3, 100)
# значения x, которые будут отображены
# количество элементов в созданном массиве
# — качество прорисовки графика
# рисуем график
plt.plot(x, y(x))
# показываем график
plt.show()
Получим график синусоиды в python в отдельном окне
Отображение нескольких графиков на одном рисунке в Python
В одной области в python можно отобразить графики нескольких функций. Добавим aeyrwb. y=x и нарисуем ее совместно с синусоидой.
Для этого введем еще одну функцию с помощью lambda
y1=lambda x: x
Построим график этой функции
plt.plot(x,y1(x))
В итоге программа в Python для построения графиков двух функций в одном окне
# импортируем модули
import numpy as np
import matplotlib.pyplot as plt
# функция
y = lambda x: np.sin(x)
y1=lambda x: x
# создаём рисунок с координатную плоскость
fig = plt.subplots()
# создаём область, в которой будет
# — отображаться график
x = np.linspace(-3, 3,100)
# значения x, которые будут отображены
# количество элементов в созданном массиве
# — качество прорисовки графика
# рисуем график
plt.plot(x, y(x))
plt.plot(x,y1(x))
# показываем график
plt.show()
Трехмерные поверхности в Python
В трёхмерном пространстве каждая точка задаётся тремя координатами, следовательно, в трёхмерном пространстве нужно два аргумента для задания функции. В этом уроке по Питону мы зададим функцию
f(x,y)=x^2-y^2
от двух аргументов. Аргументы x и y , функция z .
f = lambda x, y: x ** 2 — y ** 2
Чтобы начать рисовать трехмерные поверхности в Python нужно сначал задать область построения с помощью функции plt.figure принимает параметр figsize(x, y) , где x и y – ширина и высота рисунка в дюймах. Создадим рисунок в Python размером 12×6 дюймов для отображения графиков
fig = plt.figure(figsize = (12, 6))
В построенной области мы создадим рисунок, в котором будут отображено трёхмерное пространство с координатными осями и сама поверхность. В Питоне для этого используется fig.add_subplot() .
ax = fig.add_subplot(1, 1, 1, projection = ‘3d’)
Функция в Python fig.add_subplot() разбивает область построения на клетки и задает в какой клетке рисовать трехмерный график. Так команда ax = fig.add_subplot(1, 1, 1, projection = ‘3d’) разбивает область построения на две клтки и в первую клетку будет отображаться трехмерный гарфик, благодаря аргументу projection = ‘3d’
Введём области отображения функции для каждого аргумента в Питон.
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 и magma . Полный список цветовых схем есть на сайте Matplotlib.
Пример программы на Python построение поверхности в трёхмерном пространстве # импортируем модули
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 = (10, 10))
# создаём рисунок пространства с поверхностью
ax = fig.add_subplot(1, 1, 1, projection = ‘3d’)
# размечаем границы осей для аргументов
xval = np.linspace(-4, 4, 100)
yval = np.linspace(-4, 4, 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 = 10,
cstride = 10,
# цветовая схема plasma
cmap = cm.plasma)
Получим график трехмерной поверхности в цветовой гамме в специальном окне
Изменим параметры построения трехмерной поверхности, уменьшим размер сетик, сделаем поверхность более плавной и точной для этого уменьшаем параметры и сменим цветовую гамму на viridis
rstride = 2,
cstride = 2,
cmap = cm.viridis)
Получим график трехмерной поверхности в Python более точный и в другой цветовой гамме
Вернуться к содержанию курса python Следующая тема Классы в Питон
Построить график функции в Python
Приведем тут для начала простейший пример построений графика средствами пакета matplotlib. Для примера построим график синусоиды.
import numpy as np import matplotlib.pyplot as plt x = np.arange(0, 15, 0.1); y = np.sin(x) plt.plot(x, y) plt.show()
Вы можете самостоятельно тут экспериментировать с кодом. Например, замените функцию sin(x) на cos(x) или измените диапазон, для которого строится график: arange(0, 5, 0.1).
Matplotlib. Урок 4.1. Визуализация данных. Линейный график
Линейный график – это один из наиболее часто используемых видов графика для визуализации данных. Он использовался нами для демонстрации возможностей Matplotlib в предыдущих уроках, в этом уроке мы более подробно рассмотрим возможности настройки его внешнего вида.
- Построение графика
- Параметры аргумента fmt
Построение графика
Для построения линейного графика используется функция plot() , со следующей сигнатурой:
plot([x], y, [fmt], *, data=None, **kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2], …, **kwargs)
Если вызвать функцию plot() с одним аргументом – вот так: plot(y) , то мы получим график, у которого по оси ординат (ось y ) будут отложены значения из переданного списка, по по оси абсцисс (ось x ) – индексы элементов массива.
Рассмотрим аргументы функции plot() :
Параметры аргумента fmt
Определяет тип маркера, может принимать одно из значений, представленных в таблице ниже
Символ Описание ‘.’ Точка ( point marker ) ‘,’ Пиксель ( pixel marker ) ‘o’ Окружность ( circle marker ) ‘v’ Треугольник, направленный вниз ( triangle_down marker ) ‘^’ Треугольник, направленный вверх( triangle_up marker ) ‘ Треугольник, направленный влево ( triangle_left marker ) ‘>’ Треугольник, направленный вправо ( triangle_right marker ) ‘1’ Треугольник, направленный вниз ( tri_down marker ) ‘2’ Треугольник, направленный вверх( tri_up marker ) ‘3’ Треугольник, направленный влево ( tri_left marker ) ‘4’ Треугольник, направленный вправо ( tri_right marker ) ‘s’ Квадрат ( square marker ) ‘p’ Пятиугольник ( pentagon marker ) ‘*’ Звезда ( star marker ) ‘h’ Шестиугольник ( hexagon1 marker ) ‘H’ Шестиугольник ( hexagon2 marker ) ‘+’ Плюс ( plus marker ) ‘x’ Х-образный маркер ( x marker ) ‘D’ Ромб ( diamond marker ) ‘d’ Ромб ( thin_diamond marker ) ‘|’ Вертикальная линия ( vline marker ) ‘_’ Горизонтальная линия ( hline marker ) Стиль линии/ Может принимать одно из следующих значений:
Символ Описание ‘-‘ Сплошная линия ( solid line style ) ‘–‘ Штриховая линия ( dashed line style ) ‘-.’ Штрих-пунктирная линия ( dash-dot line style ) ‘:’ Штриховая линия ( dotted line style ) Цвет графика. В рамках аргумента fmt цвет задается значением из следующей таблицы:
Символ Описание ‘b’ Синий ‘g’ Зеленый ‘r’ Красный ‘c’ Бирюзовый ‘m’ Фиолетовый (пурпурный) ‘y’ Желтый ‘k’ Черный ‘w’ Белый Реализуем возможности plot() на примере:
x = [1, 5, 10, 15, 20] y1 = [1, 7, 3, 5, 11] y2 = [4, 3, 1, 8, 12] plt.figure(figsize=(12, 7)) plt.plot(x, y1, 'o-r', alpha=0.7, label="first", lw=5, mec='b', mew=2, ms=10) plt.plot(x, y2, 'v-.g', label="second", mec='r', lw=2, mew=2, ms=12) plt.legend() plt.grid(True)
Рассмотрим различные варианты использования линейного графика.
Заливка области между графиком и осью
Для заливки областей используется функция fill_between() . Сигнатура функции:
fill_between(x, y1, y2=0, where=None, interpolate=False, step=None, *, data=None, **kwargs)
Основные параметры функции:
- x : массив длины N
- Набор данных для оси абсцисс.
- Набор данных для оси ординат – первая кривая.
- Набор данных для оси ординат – вторая кривая.
- Задает заливаемый цветом регион, который определяется координатами x[where] : интервал будет залит между x[i] и x[i+1] , если where[i] и where[i+1] равны True .
- Определяет шаг, если используется step -функция для отображения графика (будет рассмотрена в одном из следующих уроков).
- Свойства класса Polygon
Создадим набор данных для эксперимента:
import numpy as np x = np.arange(0.0, 5, 0.01) y = np.cos(x*np.pi)
Отобразим график с заливкой:
plt.plot(x, y, c = "r") plt.fill_between(x, y)
Изменим правила заливки:
plt.plot(x, y, c = "r") plt.fill_between(x, y, where = (y > 0.75) | (y < -0.75))
Используя параметры y1 и y2 можно формировать более сложные решения.
Заливка области между 0 и y , при условии, что y >= 0:
plt.plot(x, y, c = "r") plt.fill_between(x, y, where = (y > 0))
Заливка области между 0.5 и y , при условии, что y >= 0.5:
plt.plot(x, y, c = "r") plt.grid() plt.fill_between(x, 0.5, y, where=y>=0.5)
Заливка область между y и 1:
plt.plot(x, y, c = "r") plt.grid() plt.fill_between(x, y, 1)
Вариант двухцветной заливки:
plt.plot(x, y, c = "r") plt.grid() plt.fill_between(x, y, where=y>=0, color="g", alpha=0.3) plt.fill_between(x, y, where=y
Настройка маркировки графиков
В начале этого раздела мы приводили пример использования маркеров при отображении графиков. Сделаем это ещё раз, но уже в упрощенном виде:
x = [1, 2, 3, 4, 5, 6, 7] y = [7, 6, 5, 4, 5, 6, 7] plt.plot(x, y, marker="o", c="g")
В наборе данных, который создает код:
import numpy as np x = np.arange(0.0, 5, 0.01) y = np.cos(x*np.pi)
количество точек составляет 500, поэтому подход, представленный выше уже будет не применим:
plt.plot(x, y, marker="o", c="g")
В этой случае нужно задать интервал отображения маркеров, для этого используется параметр markevery , который может принимать одно из следующих значений:
None – отображаться будет каждая точка;
N – отображаться будет каждая N -я точка;
(start, N) – отображается каждая N -я точка начиная с точки start ;
slice(start, end, N) – отображается каждая N -я точка в интервале от start до end ;
[i, j, m, n] – будут отображены только точки i, j, m, n .
Ниже представлен пример, демонстрирующий работу с markevery :
x = np.arange(0.0, 5, 0.01) y = np.cos(x*np.pi) m_ev_case = [None, 10, (100, 30), slice(100,400,15), [0, 100, 200, 300], [10, 50, 100]] fig, ax = plt.subplots(2, 3, figsize=(10, 7)) axs = [ax[i, j] for i in range(2) for j in range(3)] for i, case in enumerate(m_ev_case): axs[i].set_title(str(case)) axs[i].plot(x, y, "o", ls='-', ms=7, markevery=case)
Обрезка графика
Для того, чтобы отобразить только часть графика, которая отвечает определенному условию используйте предварительное маскирование данных с помощью функции masked_where из пакета numpy .
x = np.arange(0.0, 5, 0.01) y = np.cos(x*np.pi) y_masked = np.ma.masked_where(y < -0.5, y) plt.ylim(-1, 1) plt.plot(x, y_masked, linewidth=3)
P.S.
Вводные уроки по “Линейной алгебре на Python” вы можете найти соответствующей странице нашего сайта . Все уроки по этой теме собраны в книге “Линейная алгебра на Python”.
Если вам интересна тема анализа данных, то мы рекомендуем ознакомиться с библиотекой Pandas. Для начала вы можете познакомиться с вводными уроками. Все уроки по библиотеке Pandas собраны в книге “Pandas. Работа с данными”.
Строим математический график на Python
Сегодня мы поговорим про то, как построить математический график при помощи языка Python за 10 минут. Мы рассмотрим построение параметрических кривых в трехмерном и двумерном пространстве с использованием различных примеров.
У многих из нас со школьной скамьи остались не самые приятные воспоминания о математике. Кто-то воспринимал её как необходимое зло: сложное и скучное, но обязательное. Кто-то же отказывался понимать математику от слова совсем.
Так или иначе, но наше школьное образование было ориентировано скорее на запоминание и заучивание, а не на размышления. По большому счету не было никакой мотивации разбираться в основах математики или в том, как она на самом деле работает. Идея заключалась в том, чтобы просто узнать, какие задачи решает определенная формула, запомнить правильный набор шагов и воспроизвести все это на экзамене.
Однако математика намного обширнее и интереснее того, что мы учили в школе. Если взять, например, кинематику, можно увидеть настоящую магию математики. Кинематика известна как «геометрия движения» – это изучение взаимодействия между движущимися телами во времени. Хотя бы раз увидите такое визуальное представление математических функций — и они оживут для вас. Возможно, в тот момент вы почувствуете, что впервые понимаете их правильно.
Итак, давайте научимся самостоятельно моделировать данные и начнем писать собственные скрипты. Сегодня мы поговорим о параметрических кривых и как их строить, используя Python и такие библиотеки, как NumPy, SymPy и Matplotlib.
Построение параметрических кривых
Параметрические кривые поистине завораживают! Если говорить простым языком, параметрическую кривую можно понимать как след, оставляемый движением частицы в пространстве. Говоря более формально, этот след моделируется функцией, определяемой от интервала I до различных точек в пространстве E .
Для трехмерного случая, если x , y и z заданы как функции переменной t в I (это параметр), мы получаем уравнения x = f(t) , y = g(t) и z = h(t) . Оценивая каждое значение параметра t в каждом из этих уравнений, мы получаем точку p(t) = (x(t),y(t),z(t)) в пространстве. Проделав эту процедуру для значений t , меняющихся в интервале I , мы получим параметрическую кривую.
Проведя небольшое исследование, попробовав несколько моделей вручную и потратив много часов на работу над сценарием, мы нашли решение. Оно выглядит следующим образом:
import sympy as sp import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D t = sp.Symbol('t') function_x = sp.sympify('sin(t)') function_y = sp.sympify('cos(t)') function_z = sp.sympify('t**2') interval = np.arange(0, 100, 0.1) x_values = [function_x.subs(t, value) for value in interval] y_values = [function_y.subs(t, value) for value in interval] z_values = [function_z.subs(t, value) for value in interval] fig = plt.figure(figsize=(10, 10)) ax = plt.axes(projection='3d') ax.plot(x_values, y_values, z_values) plt.show()
Приведенный выше скрипт позволяет нам генерировать графики для параметрических кривых. К примеру, вот так выглядит график параметрической спирали p(t) = (sin(t),cos(t),sqrt(t3)) , для интервала от 0 до 100.
Как работает скрипт
Скрипт, который мы привели выше, использует такие библиотеки, как SymPy, NumPy и Matplotlib. Давайте разберемся со всем по порядку.
SymPy — это библиотека Python для символьной математики. Она стремится стать полнофункциональной системой компьютерной алгебры (CAS). При этом сохраняется максимально простой код (а значит, понятный и масштабируемый). Библиотека SymPy, кстати, полностью написана на Python.
NumPy — это основной пакет для научных вычислений в Python. Эта библиотека предоставляет:
- объекты многомерного массива,
- различные производные объекты (такие как маскированные массивы и матрицы)
- набор подпрограмм для быстрых операций с массивами, включая математические и логические, манипуляции с фигурами, сортировку, выборку, ввод-вывод, дискретные преобразования Фурье, основные операции линейной алгебры, основные статистические операции и случайное моделирование.
И последняя библиотека из нашего списка — Matplotlib. Это обширная библиотека для создания статических, анимированных и интерактивных визуализаций на Python.
Подготовка
Чтобы использовать перечисленные выше библиотеки в нашем скрипте, мы должны сначала установить их на свой компьютер, выполнив следующую инструкцию в терминале:
pip install numpy sympy matplotlib
Теперь, когда библиотеки установлены, мы можем импортировать их в нашу программу:
import sympy as sp import numpy as np import matplotlib.pyplot as plt
Построение графика трехмерной параметрической кривой
Символьные вычисления в SymPy выполняются с помощью символов. Переменные SymPy являются объектами класса Symbols . Выражение t = sp.Symbol('t') присваивает символ t переменной t , с которой мы теперь можем работать как с математической переменной.
Выглядит это следующим образом:
t = sp.Symbol('t') print(t ** 2) >>> t ^ 2
В рамках этой задачи нам нужно работать с составными выражениями, хранящимися в строке. Поэтому нам нужно сделать преобразование строки в математическое выражение понятным для SymPy. Для этого мы используем функцию sympify.sp.sympify(expression) , которая преобразует параметрическое выражение в общее математическое выражение.
К примеру, наш код будет выглядеть так:
function_z = sp.sympify('t^2') print(function_z + 2) >>> t ^ 2 + 2
Теперь переменная function_z содержит математическое выражение t 2 +2 .
Следующим шагом является возможность оценить параметр t внутри математического выражения. Функция subs() в SymPy позволит нам оценить выражение с заданным значением. Мы можем использовать его следующим образом: expression.subs(t, value) .
Наш код будет выглядеть следующим образом:
value = function_z.subs(t, 5) print(value) >>> 5 ^ 2 = 25
Поскольку мы говорим о параметрических функциях, нас интересует оценка функции на последовательности вещественных значений в пределах интервала. Для этого мы используем функцию arange() в NumPy.
Функция np.arange(start, stop, step) создает массив NumPy со значениями в интервале (start,stop) с приращением шага, то есть мы идем от start до stop-1 с определенным шагом step .
Наш код будет выглядеть так:
interval = np.arange(0, 10, 1) print(interval) >>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
После создания массива интервалов нам нужно перебрать значения t и оценить каждое значение внутри функции. Для этого мы будем использовать генератор списков в Python и функцию subs() библиотеки SimPy.
О генераторах списков можно почитать в статье «Генераторы списков в Python для начинающих».
Функция subs() получает символ t (который мы сохранили в переменной t ) и значение каждого из элемента в качестве параметров.
Выглядит это примерно следующим образом:
z_values = [function_z.subs(t, value) for value in interval] print(z_values) >>> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Мы повторяем эту процедуру для значений x_values и y_values и таким образом получаем массивы со значениями для построения.
Наконец, с помощью библиотеки Matplotlib мы создаем график, соответствующий нашей параметрической кривой. В трехмерном случае, чтобы указать Matplotlib, что мы хотим сделать трехмерный график, мы используем следующий оператор:
Кроме того, мы можем заменить функции и интервал на новые и получить самые разные кривые. Давайте попробуем еще раз, но с другими значениями.
Например, напишем следующий код:
function_x = sp.sympify('2*t + 10') function_y = sp.sympify('t**2') function_z = sp.sympify('sin(t**2) + cos(t**2)') interval = np.arange(-5, 5, 0.05)
Запустим наш код и получим такой график:
Немного поэкспериментируем
Давайте немного поэкспериментируем с нашим кодом: попробуем различные значения и посмотрим, что получится. С помощью параметрических кривых можно создать множество фигур. Некоторые комбинации могут генерировать кривые с уникальной симметрией и красотой.
Если вы хотите поиграть со скриптом самостоятельно, можете открыть эту ссылку и заменить значения для function_x , function_y , function_z и interval .
К примеру, можно взять следующий код:
import sympy as sp import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D symbol_x = sp.Symbol('t') function_x = sp.sympify('sin(t)') function_y = sp.sympify('t^2+2*t') function_z = sp.sympify('t^2') interval = np.arange(-10, 10, 0.1) x_values = [function_x.subs(symbol_x, value) for value in interval] y_values = [function_y.subs(symbol_x, value) for value in interval] z_values = [function_z.subs(symbol_x, value) for value in interval] fig = plt.figure(figsize=(10, 10)) ax = plt.axes(projection='3d') ax.plot(x_values, y_values, z_values) plt.show()
Запустив его, мы получим такой результат:
Поиграйтесь сами и посмотрите, какие удивительные параметрические кривые можно создать!
Построение 2D параметрических кривых
С некоторыми модификациями данный скрипт также можно использовать и для построения двумерных параметрических кривых.
Например, давайте построим двумерный график, полученный путем оценки выражения x = t − 1,6 ∗ cos(24 ∗ t) и y = t − 1,6 ∗ sin(25 ∗ t) на интервале I=[1.5,20.5] .
Выглядеть это будет примерно следующим образом:
Для того, чтобы смоделировать параметрическую кривую, показанную выше, можно воспользоваться следующим скриптом:
import sympy as sp import numpy as np import matplotlib.pyplot as plt t = sp.Symbol('t') function_x = sp.sympify('t - 1.6*cos(24*t)') function_y = sp.sympify('t - 1.6*sin(25*t)') interval = np.arange(1.5, 20.5, 0.01) x_values = [function_x.subs(t, value) for value in interval] y_values = [function_y.subs(t, value) for value in interval] plt.figure(figsize=(10, 10)) plt.plot(x_values, y_values) plt.show()
Давайте проверим наш код с другими функциями и новым интервалом. К примеру, возьмем следующие значения:
function_x = sp.sympify('4*sin(5*t)') function_y = sp.sympify('5*cos(3*t)') interval = np.arange(0, 6.5, 0.001)
Запустим наш скрипт и получим следующий график:
Теперь давайте проделаем это ещё раз, но уже с новыми значениями:
function_x = sp.sympify('cos(16*t) + (cos(6*t) / 2) + (sin(10*t) / 3)') function_y = sp.sympify('sin(16*t) + (sin(6*t) / 2) + (cos(10*t) / 3)') interval = np.arange(0, 3.16, 0.01)
Тогда результат будет таким:
Удивительно! Не правда ли?
Построение математических функций
Как только мы закончили написание скрипта для моделирования параметрических кривых, приходит осознание, что с помощью всего нескольких строк кода мы можем создать плоттер для математических функций как в двух, так и в трех измерениях! Невероятно! Это же так удобно!
К примеру, давайте рассмотрим скрипт для построения графиков математических функций в двух и трех измерениях в интервале от a до b . То есть, консоль запросит у пользователя как функцию, так и значения a и b для интервала. Вот такой код у нас получится:
import sympy as sp import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D symbol_x = sp.Symbol('x') symbol_y = sp.Symbol('y') def get_vector(a, b): return np.arange(a, b + 1, 0.1) def plot_2d_function(function, a, b): # Create the sympy function f(x) f_x = sp.sympify(function) # Create domain and image domain_x = get_vector(a, b) image = [f_x.subs(symbol_x, value) for value in domain_x] # Plot the 2D function graph fig = plt.figure(figsize=(10, 10)) plt.plot(domain_x, image) plt.show() def plot_3d_function(function, a, b): # Create sympy function f(x, y) f_xy = sp.lambdify((symbol_x, symbol_y), sp.sympify(function)) # Create domains and image domain_x = get_vector(a, b) domain_y = get_vector(a, b) domain_x, domain_y = np.meshgrid(domain_x, domain_y) image = f_xy(domain_x, domain_y) # Plot the 3D function graph fig = plt.figure(figsize=(10, 10)) ax = plt.axes(projection='3d') ax.plot_surface(domain_x, domain_y, image, rstride=1, cstride=1, cmap='viridis') plt.show() function = input('>> Enter the function: ') a_value = float(input('>> Enter the [a, ] value: ')) b_value = float(input('>> Enter the [, b] value: ')) if "x" and not "y" in function: plot_2d_function(function, a_value, b_value) elif "x" and "y" in function: plot_3d_function(function, a_value, b_value) else: print("You must enter a function in terms of x and/or y")
Вы можете протестировать приведенный выше скрипт здесь. Запустите скрипт и введите свою конфигурацию функции и интервала.
Например, возьмем следующий код:
import sympy as sp import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D symbol_x = sp.Symbol('x') symbol_y = sp.Symbol('y') def get_vector(a, b): return np.arange(a, b + 1, 0.1) def plot_2d_function(function, a, b): # Create the sympy function f(x) f_x = sp.sympify(function) # Create domain and image domain_x = get_vector(a, b) image = [f_x.subs(symbol_x, value) for value in domain_x] # Plot the 2D function graph fig = plt.figure(figsize=(10, 10)) plt.plot(domain_x, image) plt.show() def plot_3d_function(function, a, b): # Create sympy function f(x, y) f_xy = sp.lambdify((symbol_x, symbol_y), sp.sympify(function)) # Create domains and image domain_x = get_vector(a, b) domain_y = get_vector(a, b) domain_x, domain_y = np.meshgrid(domain_x, domain_y) image = f_xy(domain_x, domain_y) # Plot the 3D function graph fig = plt.figure(figsize=(10, 10)) ax = plt.axes(projection='3d') ax.plot_surface(domain_x, domain_y, image, rstride=1, cstride=1, cmap='viridis') plt.show() function = "x*cos(5*x)" a_value = 0 b_value = 10 if "x" and not "y" in function: plot_2d_function(function, a_value, b_value) elif "x" and "y" in function: plot_3d_function(function, a_value, b_value) else: print("You must enter a function in terms of x and/or y")
Запустим его и получим следующий результат:
А теперь давайте поменяем значения на следующие:
import sympy as sp import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D symbol_x = sp.Symbol('x') symbol_y = sp.Symbol('y') def get_vector(a, b): return np.arange(a, b + 1, 0.1) def plot_2d_function(function, a, b): # Create the sympy function f(x) f_x = sp.sympify(function) # Create domain and image domain_x = get_vector(a, b) image = [f_x.subs(symbol_x, value) for value in domain_x] # Plot the 2D function graph fig = plt.figure(figsize=(10, 10)) plt.plot(domain_x, image) plt.show() def plot_3d_function(function, a, b): # Create sympy function f(x, y) f_xy = sp.lambdify((symbol_x, symbol_y), sp.sympify(function)) # Create domains and image domain_x = get_vector(a, b) domain_y = get_vector(a, b) domain_x, domain_y = np.meshgrid(domain_x, domain_y) image = f_xy(domain_x, domain_y) # Plot the 3D function graph fig = plt.figure(figsize=(10, 10)) ax = plt.axes(projection='3d') ax.plot_surface(domain_x, domain_y, image, rstride=1, cstride=1, cmap='viridis') plt.show() function = "x**2 + cos(y**2)" a_value = -3 b_value = 3 if "x" and not "y" in function: plot_2d_function(function, a_value, b_value) elif "x" and "y" in function: plot_3d_function(function, a_value, b_value) else: print("You must enter a function in terms of x and/or y")
Если мы это запустим, то получим такой график:
Заключение
Что ж, вот вы и дошли до конца этой статьи, поздравляем! Сегодня мы обсудили, как построить математический график на Python всего за 10 минут. Мы поговорили про построение различных параметрических кривых в двумерном и трёхмерном пространстве и разобрали процесс построения на примерах. Теперь вы видите, какой завораживающей на самом деле может быть математика! Кроме того, построение параметрических кривых, как вы понимаете, не такой уж и сложный процесс.
Надеемся, данная статья была вам полезна! Успехов в написании кода!