使用由少数元素构成的向量来平滑曲线?
Smoothing a curve with vectors made by few elements?
我有 4 条曲线,由这些向量表示:
x = [300, 700, 1000, 1500]
y1 = [-1.0055394199673442, -0.11221578805214968, -1.502661406039569, 1.0216939169819494]
y2 = [-1.0200777228890747, -0.6951505674297687, -2.832988761335546, 1.0253075071285915]
y3 = [2.0502387421569463, -1.3363305947335058, 0.2893545237634795, 0.8692051683379767]
y4 = [1.8676528391899183, -1.7554177636905024, 0.2364994810496486, 0.9811885784744991]
当我绘制它们时,我得到了这样的东西:
如您所见,这些向量的少数值导致这些曲线呈锯齿形,我希望它们更平滑。我在 Python 和 Matlab 中尝试了不同的方法。例如,在 python 中,我使用了像这样的 numpy 方法:
xp = np.linspace(300,1500,100,endpoint=True)
z1 = np.polyfit(x, y1, 3)
p1 = np.poly1d(z1)
z2 = np.polyfit(x, y2, 3)
p2 = np.poly1d(z2)
z3 = np.polyfit(x,y3, 3)
p3 = np.poly1d(z3)
z4 = np.polyfit(x, y4, 3)
p4 = np.poly1d(z4)
我得到了这个:
但是通过这种方式,对于 x 向量之间的值,我不确定是否存在最小值和最大值点。
此外,我在 Matlab 中尝试了具有不同平滑值的“平滑”函数,但它们也改变了向量内的值,这些值不再像原始值,即它们对于我想解释的概念毫无意义。
我想稍微平滑一下曲线的曲折部分,使曲线看起来更舒适……你能帮帮我吗? Python 或 Matlab 对我来说都是一样的,我对一切都持开放态度! :)
好吧,所以我在这里提出的是作弊和发明数据,但至少它使曲线看起来更像你(或你的主管)想要的。
x = [300, 700, 1000, 1500] # your original x
x2 = [300, 500, 700, 850, 1000, 1250, 1500] # add points in between
# interpolate your data for the new points in x2
p1 = np.interp(x2,x,y1)
p2 = np.interp(x2,x,y2)
p3 = np.interp(x2,x,y3)
p4 = np.interp(x2,x,y4)
# cubic spline interpolation on xp, so it looks smooth
p1 = scipy.interpolate.CubicSpline(x2,p1)
p2 = scipy.interpolate.CubicSpline(x2,p2)
p3 = scipy.interpolate.CubicSpline(x2,p3)
p4 = scipy.interpolate.CubicSpline(x2,p4)
这是它的样子:
如果您对它的外观不满意,可以在 x2
中尝试不同的值。
编辑:
这里是生成情节的完整代码:
import numpy as np
from scipy.interpolate import CubicSpline
import matplotlib.pyplot as plt
x = [300, 700, 1000, 1500] # your orginial x
x2 = [300, 500, 700, 850, 1000, 1250, 1500] # add points in between
xp = np.linspace(300,1500,100,endpoint=True) # your x-axis for smooth curve plot
# your orginal data
y1 = [-1.0055394199673442, -0.11221578805214968, -1.502661406039569, 1.0216939169819494]
y2 = [-1.0200777228890747, -0.6951505674297687, -2.832988761335546, 1.0253075071285915]
y3 = [2.0502387421569463, -1.3363305947335058, 0.2893545237634795, 0.8692051683379767]
y4 = [1.8676528391899183, -1.7554177636905024, 0.2364994810496486, 0.9811885784744991]
for yi in [y1,y2,y3,y4]:
# Piecewise linear interpolation of data y over the points x2
y_interpolated_over_x2 = np.interp(x2,x,yi)
# Make a cubic spline from the manipulated data
y_cubic_spline = CubicSpline(x2, y_interpolated_over_x2)
# The smooth curve is the cubic spline evaluated at points xp
y_smooth = y_cubic_spline(xp)
plt.plot(xp, y_smooth) # plot the smooth curve
plt.scatter(x, yi) # plot the original data points
plt.show()
我有 4 条曲线,由这些向量表示:
x = [300, 700, 1000, 1500]
y1 = [-1.0055394199673442, -0.11221578805214968, -1.502661406039569, 1.0216939169819494]
y2 = [-1.0200777228890747, -0.6951505674297687, -2.832988761335546, 1.0253075071285915]
y3 = [2.0502387421569463, -1.3363305947335058, 0.2893545237634795, 0.8692051683379767]
y4 = [1.8676528391899183, -1.7554177636905024, 0.2364994810496486, 0.9811885784744991]
当我绘制它们时,我得到了这样的东西:
如您所见,这些向量的少数值导致这些曲线呈锯齿形,我希望它们更平滑。我在 Python 和 Matlab 中尝试了不同的方法。例如,在 python 中,我使用了像这样的 numpy 方法:
xp = np.linspace(300,1500,100,endpoint=True)
z1 = np.polyfit(x, y1, 3)
p1 = np.poly1d(z1)
z2 = np.polyfit(x, y2, 3)
p2 = np.poly1d(z2)
z3 = np.polyfit(x,y3, 3)
p3 = np.poly1d(z3)
z4 = np.polyfit(x, y4, 3)
p4 = np.poly1d(z4)
我得到了这个:
但是通过这种方式,对于 x 向量之间的值,我不确定是否存在最小值和最大值点。 此外,我在 Matlab 中尝试了具有不同平滑值的“平滑”函数,但它们也改变了向量内的值,这些值不再像原始值,即它们对于我想解释的概念毫无意义。 我想稍微平滑一下曲线的曲折部分,使曲线看起来更舒适……你能帮帮我吗? Python 或 Matlab 对我来说都是一样的,我对一切都持开放态度! :)
好吧,所以我在这里提出的是作弊和发明数据,但至少它使曲线看起来更像你(或你的主管)想要的。
x = [300, 700, 1000, 1500] # your original x
x2 = [300, 500, 700, 850, 1000, 1250, 1500] # add points in between
# interpolate your data for the new points in x2
p1 = np.interp(x2,x,y1)
p2 = np.interp(x2,x,y2)
p3 = np.interp(x2,x,y3)
p4 = np.interp(x2,x,y4)
# cubic spline interpolation on xp, so it looks smooth
p1 = scipy.interpolate.CubicSpline(x2,p1)
p2 = scipy.interpolate.CubicSpline(x2,p2)
p3 = scipy.interpolate.CubicSpline(x2,p3)
p4 = scipy.interpolate.CubicSpline(x2,p4)
这是它的样子:
如果您对它的外观不满意,可以在 x2
中尝试不同的值。
编辑:
这里是生成情节的完整代码:
import numpy as np
from scipy.interpolate import CubicSpline
import matplotlib.pyplot as plt
x = [300, 700, 1000, 1500] # your orginial x
x2 = [300, 500, 700, 850, 1000, 1250, 1500] # add points in between
xp = np.linspace(300,1500,100,endpoint=True) # your x-axis for smooth curve plot
# your orginal data
y1 = [-1.0055394199673442, -0.11221578805214968, -1.502661406039569, 1.0216939169819494]
y2 = [-1.0200777228890747, -0.6951505674297687, -2.832988761335546, 1.0253075071285915]
y3 = [2.0502387421569463, -1.3363305947335058, 0.2893545237634795, 0.8692051683379767]
y4 = [1.8676528391899183, -1.7554177636905024, 0.2364994810496486, 0.9811885784744991]
for yi in [y1,y2,y3,y4]:
# Piecewise linear interpolation of data y over the points x2
y_interpolated_over_x2 = np.interp(x2,x,yi)
# Make a cubic spline from the manipulated data
y_cubic_spline = CubicSpline(x2, y_interpolated_over_x2)
# The smooth curve is the cubic spline evaluated at points xp
y_smooth = y_cubic_spline(xp)
plt.plot(xp, y_smooth) # plot the smooth curve
plt.scatter(x, yi) # plot the original data points
plt.show()