У меня есть базовый пример графика, и я пытаюсь сделать все точки на какой-то изогнутой линии. У меня есть идея, как это сделать, но я не уверен, как это реализовать и возможно ли это вообще. Ниже у меня есть изображение графика, который я сделал с помощью следующего кода:
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()
Вот график, который получается:
Вопрос, который у меня есть, заключается в том, как сделать так, чтобы все пунктирные линии соединялись плавно? У меня была идея усреднить каждые два сегмента линии, содержащие одинаковые точки, но я не знаю, как это сделать. Другая идея, которая у меня была, заключалась в том, чтобы сделать какую-то кривую Безье, которая соединяет все точки, но это звучит излишне сложно.
Что-то вроде зеленой линии должно быть на выходе (извините за плохо нарисованную линию):
Я в замешательстве: а как насчет того, чтобы текущая линия подгонки не «соединилась без проблем»? Мне кажется, что это гладкая линия
При этом сплайн часто используется, как предложил @JohanC. Одним из преимуществ является то, что вы можете управлять порядком сплайнов, поэтому n-я производная будет гладкой.
вы можете использовать квадратичную интерполяцию для построения плавной кривой, как это было предложено @JohanC
Вы можете использовать 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()
Вы можете попробовать
interpolate.splrep()
иinterpolate.splev()
. См., например. Создание плавной линии на основе точек