For that type of graph, you want monotonic interpolation. The PchipInterpolator
class (which you can refer to by its shorter alias pchip
) in scipy.interpolate can be used:
import numpy as np
from scipy.interpolate import pchip
import matplotlib.pyplot as plt
# Data to be interpolated.
x = np.arange(10.0)
y = np.array([5.0, 10.0, 20.0, 15.0, 13.0, 22.0, 20.0, 15.0, 12.0, 16.0])
# Create the interpolator.
interp = pchip(x, y)
# Dense x for the smooth curve.
xx = np.linspace(0, 9.0, 101)
# Plot it all.
plt.plot(xx, interp(xx))
plt.plot(x, y, 'bo')
plt.ylim(0, 25)
plt.grid(True)
plt.show()
Result: