Простое решение использует scipy's interp1d для создания сплайна куби c через точки.
Подход, позволяющий избежать выхода кривой за пределы диапазона окружающих точек, состоит в следующем: чтобы создать кубическую c кривую Безье с добавлением дополнительных промежуточных точек:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
from scipy.interpolate import interp1d
x = np.array([1, 3, 4, 5])
y = np.array([1, 9, 2, 5])
plt.plot(x, y, 'ob:', lw=1)
x_smooth = np.linspace(x[0], x[-1], 500)
f1 = interp1d(x, y, kind='cubic')
plt.plot(x_smooth, f1(x_smooth), 'g')
x2 = np.convolve(np.repeat(x, 3), [1/3,1/3,1/3])[2:-2]
y2 = np.repeat(y, 3)[1:-1]
f2 = interp1d(x2, y2, kind='cubic')
plt.plot(x2, y2, 'k--', lw=0.5)
verts = list(zip(x2, y2))
codes = [Path.MOVETO] + [Path.CURVE4 for _ in range(len(verts) - 1)]
patch = patches.PathPatch(Path(verts, codes), facecolor='none', lw=3, edgecolor='r')
plt.gca().add_patch(patch)
plt.legend(['Linear', 'Cubic Spline', 'extra points', 'adapted Bezier'])
plt.show()
![resulting plot](https://i.stack.imgur.com/lt7yh.png)
Обратите внимание, что также несколько других типов доступны сплайн-функции .