我在 x 轴上有 3 个数据点,在 y 轴上有 3 个数据点:
x = [1,3,5]
y=[0,5,0]
我想要一条曲线,从 (1,0) 开始,到 (3,5) 的最高点,然后在 (5,0) 结束
我想我需要使用插值,但不确定如何使用。如果我像这样使用 scipy 中的样条:
import bokeh.plotting as bk
from scipy.interpolate import spline
p = bk.figure()
xvals=np.linspace(1, 5, 10)
y_smooth = spline(x,y,xvals)
p.line(xvals, y_smooth)
bk.show(p)
请您参考如下方法:
问题是由于没有额外参数的 spline 是 3 阶的。这意味着您没有足够的点/方程来获得样条曲线(这表现为警告病态矩阵)。您需要应用低阶样条,例如 2 阶的三次样条:
import bokeh.plotting as bk
from scipy.interpolate import spline
p = bk.figure()
xvals=np.linspace(1, 5, 10)
y_smooth = spline(x,y,xvals, order=2) # This fixes your immediate problem
p.line(xvals, y_smooth)
bk.show(p)
此外,spline 在 SciPy 中已被弃用,因此您最好不要使用它,即使可能。更好的解决方案是使用 CubicSpline 类:
import bokeh.plotting as bk
from scipy.interpolate import CubicSpline
p = bk.figure()
xvals=np.linspace(1, 5, 10)
spl = CubicSpline(x, y) # First generate spline function
y_smooth = spl(xvals) # then evalute for your interpolated points
p.line(xvals, y_smooth)
bk.show(p)
只是为了显示差异(使用 pyplot):
可以看出,CubicSpline 与 order=2 的spline 相同
