Как построить гладкую кривую в Matplotlib?

Опубликовано: 16 Июля, 2021

Предварительное условие: Введение в Matplotlib

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

Функция matplotlib.pyplot.plot () по умолчанию создает кривую, соединяя две соседние точки в данных прямой линией, и, следовательно, функция matplotlib.pyplot.plot () не создает плавную кривую для небольшого диапазона данных. точки.

Пример:

Python




import numpy as np
import matplotlib.pyplot as plt
# Dataset
x = np.array([ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ])
y = np.array([ 20 , 30 , 5 , 12 , 39 , 48 , 50 , 3 ])
# Plotting the Graph
plt.plot(x, y)
plt.title( "Curve plotted using the given points" )
plt.xlabel( "X" )
plt.ylabel( "Y" )
plt.show()

Выход:

Обратите внимание, что график совсем не гладкий, поскольку базовые данные не следуют плавной линии. Чтобы построить гладкую кривую, мы сначала подгоняем кривую сплайна к кривой и используем кривую, чтобы найти значения y для значений x, разделенных бесконечно малым зазором. Мы можем получить гладкую кривую, построив эти точки с очень маленьким промежутком.

Мы можем использовать следующие методы, чтобы создать плавную кривую для этого набора данных:

1. Сглаживание кривой сплайна с помощью PyPlot:

Он строит гладкую сплайн-кривую, сначала определяя коэффициенты сплайн-кривой с помощью scipy.interpolate.make_interp_spline (). Мы используем заданные точки данных для оценки коэффициентов сплайновой кривой, а затем мы используем коэффициенты для определения значений y для очень близко расположенных значений x, чтобы кривая выглядела гладкой. Здесь мы будем использовать метод np.linspace (), который возвращает равномерно распределенные выборки, рассчитанные за указанный интервал. Необязательный параметр num - это количество выборок, которые необходимо сгенерировать в пределах диапазона start и stop. Значение по умолчанию - 50 и должно быть неотрицательным. Мы хотим, чтобы этот параметр имел достаточно высокое значение для создания плавной кривой. Давайте возьмем 500 равноотстоящих отсчетов между минимальным и максимальным значениями по оси X, чтобы построить кривую.

Syntax: 

numpy.linspace(start, stop, num = 50, endpoint = True, retstep = False, dtype = None, axis = 0)

X_Y_Spline = scipy.interpolate.make_interp_spline(x, y)



Пример:

Python




import numpy as np
import numpy as np
from scipy.interpolate import make_interp_spline
import matplotlib.pyplot as plt
# Dataset
x = np.array([ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ])
y = np.array([ 20 , 30 , 5 , 12 , 39 , 48 , 50 , 3 ])
X_Y_Spline = make_interp_spline(x, y)
# Returns evenly spaced numbers
# over a specified interval.
X_ = np.linspace(x. min (), x. max (), 500 )
Y_ = X_Y_Spline(X_)
# Plotting the Graph
plt.plot(X_, Y_)
plt.title( "Plot Smooth Curve Using the scipy.interpolate.make_interp_spline() Class" )
plt.xlabel( "X" )
plt.ylabel( "Y" )
plt.show()

Выход:

2. Сплайн-кривая с использованием кубической интерполяции

Он генерирует кривую кубической интерполяции с использованием класса scipy.interpolate.interp1d, а затем мы используем кривую для определения значений y для близко расположенных значений x для гладкой кривой. Здесь также мы будем использовать метод np.linspace (), который возвращает равномерно распределенные выборки, рассчитанные за указанный интервал. Давайте возьмем 500 равноотстоящих отсчетов между минимальным и максимальным значениями по оси X, чтобы построить кривую. В зависимости от того, насколько изогнутой должна быть линия, вы можете изменить значение третьего (num) параметра.

Syntax:

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)

cubic_interploation_model=scipy.interpolate.interp1d(x,y,kind=”cubic”)

Пример:

Python




import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
# Dataset
x = np.array([ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ])
y = np.array([ 20 , 30 , 5 , 12 , 39 , 48 , 50 , 3 ])
cubic_interploation_model = interp1d(x, y, kind = "cubic" )
# Plotting the Graph
X_ = np.linspace(x. min (), x. max (), 500 )
Y_ = cubic_interploation_model(X_)
plt.plot(X_, Y_)
plt.title( "Plot Smooth Curve Using the scipy.interpolate.interp1d Class" )
plt.xlabel( "X" )
plt.ylabel( "Y" )
plt.show()

Выход:

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.