Сделайте так, чтобы линии квадратичной регрессии плавно соединялись с помощью matplotlib

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

import matplotlib.pyplot as plt
import numpy as np

# original data
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [2, 7, 3, 4, 5, 1, 6, 9, 4, 6]

# quadratic regression
for i in range(int((len(x) + len(y)) / 2)):
    sub_x = x[i:i+3]
    sub_y = y[i:i+3]
    
    model = np.poly1d(np.polyfit(sub_x, sub_y, 2))
    polyline = np.linspace(min(sub_x), max(sub_x), 200)
    plt.plot(polyline, model(polyline), color = "#6D34D6", linestyle='dashed')

# plot lines
plt.scatter(x, y, color='#FF3FAF')
plt.plot(x, y, color='#FF3FAF', linestyle='solid')
plt.show()

Вот график, который получается:

Вопрос, который у меня есть, заключается в том, как сделать так, чтобы все пунктирные линии соединялись плавно? У меня была идея усреднить каждые два сегмента линии, содержащие одинаковые точки, но я не знаю, как это сделать. Другая идея, которая у меня была, заключалась в том, чтобы сделать какую-то кривую Безье, которая соединяет все точки, но это звучит излишне сложно.

Что-то вроде зеленой линии должно быть на выходе (извините за плохо нарисованную линию):

Вы можете попробовать interpolate.splrep() и interpolate.splev(). См., например. Создание плавной линии на основе точек

JohanC 11.12.2020 00:05

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

anon01 11.12.2020 00:07

При этом сплайн часто используется, как предложил @JohanC. Одним из преимуществ является то, что вы можете управлять порядком сплайнов, поэтому n-я производная будет гладкой.

anon01 11.12.2020 00:09

вы можете использовать квадратичную интерполяцию для построения плавной кривой, как это было предложено @JohanC

Akshay Sehgal 11.12.2020 00:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
356
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать scipy.interpolate.interp1d, чтобы применить квадратичную интерполяцию, чтобы увеличить количество точек, скажем, до 300, а затем построить плавную кривую.

import matplotlib.pyplot as plt
import seaborn as sns
from scipy.interpolate import interp1d

# original data
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [2, 7, 3, 4, 5, 1, 6, 9, 4, 6]

# quadratic regression
for i in range(int((len(x) + len(y)) / 2)):
    sub_x = x[i:i+3]
    sub_y = y[i:i+3]
    
    model = np.poly1d(np.polyfit(sub_x, sub_y, 2))
    polyline = np.linspace(min(sub_x), max(sub_x), 200)
    plt.plot(polyline, model(polyline), color = "#6D34D6", linestyle='dashed')


#Interpolate
x_new = np.linspace(min(x), max(x), 300)  #<----
f = interp1d(x, y, kind='quadratic')      #<----

# plot lines
plt.scatter(x, y, color='#FF3FAF')
plt.plot(x_new, f(x_new), color='#FF3FAF', linestyle='solid') #<----
plt.show()

Другие вопросы по теме