我在x轴上有3个数据点,在y轴上有3个数据点:
x = [1,3,5]
y=[0,5,0]
我想要一条曲线从(1,0)开始,到达(3,5)的最高点,然后在(5,0)结束
我想我需要使用插值,但不确定如何。如果我像scipy那样使用spline:
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)
答案 0 :(得分:4)
问题是由于没有额外参数的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)
此外,在SciPy中不推荐使用spline
,因此您最好不要使用它,即使可能。更好的解决方案是使用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
与spline
的{{1}}相同
答案 1 :(得分:1)
您可以使用二次插值。这可以通过使用scipy.interpolate.interp1d
。
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
import numpy as np
x = [1, 3, 5]
y = [0, 5, 0]
f = interp1d(x, y, kind='quadratic')
x_interpol = np.linspace(1, 5, 1000)
y_interpol = f(x_interpol)
plt.plot(x_interpol, y_interpol)
plt.show()
查看documentation了解详情。
答案 2 :(得分:1)