图中3点之间的曲线平滑

时间:2018-02-19 22:47:56

标签: python plot bokeh

我在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)

我得到之前的最高点(3,5)并且它看起来不平衡: enter image description here

3 个答案:

答案 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):

enter image description here

可以看出,CubicSplinespline的{​​{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)

使用pchip_interpolate()

import numpy as np
from scipy import interpolate

x = [1,3,5]
y=[0,5,0]

x2 = np.linspace(x[0], x[-1], 100)
y2 = interpolate.pchip_interpolate(x, y, x2)
pl.plot(x2, y2)
pl.plot(x, y, "o")

结果:

enter image description here