Skip to main content
 首页 » 编程设计

python之图中 3 点之间的平滑曲线

2025年05月04日16yjmyzz

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

我得到了 (3,5) 之前的最高点,看起来不平衡:

请您参考如下方法:

问题是由于没有额外参数的 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 相同