绘图中 3 个点之间的平滑曲线

Cla*_*nga 2 python plot bokeh

我在 x 轴上有 3 个数据点,在 y 轴上有 3 个数据点:

x = [1,3,5]
y=[0,5,0]
Run Code Online (Sandbox Code Playgroud)

我想要一条从 (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)
Run Code Online (Sandbox Code Playgroud)

我在 (3,5) 之前获得了最高点,它看起来不平衡: 在此处输入图片说明

Joh*_*anL 8

问题是由于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)
Run Code Online (Sandbox Code Playgroud)

此外,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)
Run Code Online (Sandbox Code Playgroud)

只是为了显示差异(使用 pyplot):

在此处输入图片说明

如可以看到的那样,CubicSpline是相同的splineorder=2