簡體   English   中英

圖中3點之間的平滑曲線

[英]Smooth curved line between 3 points in plot

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

在此處輸入圖片說明

可以看出, CubicSplineorder=2spline相同

您可以使用二次插值。 這可以通過使用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()

查看文檔以獲取更多詳細信息。

使用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")

結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM