使二次回归线与 matplotlib 无缝连接

Make quadratic regression lines connect seamlessly with 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()

生成的图片如下:

我的问题是如何让所有的虚线无缝连接?我有一个关于平均每两个包含相同点的线段的想法,但我不知道如何去做。我的另一个想法是制作某种连接所有点的贝塞尔曲线,但这听起来不必要地复杂。

应该输出类似绿线的东西(抱歉画得不好):

您可以使用 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()