Один из возможных подходов - определить ad ho c класс нормализации
In [27]: class normalize():
...: def __init__(self, positions):
...: self.positions = positions.sort() or positions
...: self.outputs = np.arange(len(positions))/(len(positions)-1)
...: def __call__(self, x):
...: return np.interp(x, self.positions, self.outputs, np.nan, np.nan)
и быть осторожным при определении y
позвоночника (в дальнейшем для ради примера я собираюсь построить график y = 20 (x + x²) )
In [28]: positions = [0, 5, 27, 40]
...: f = normalize(positions)
...: lp = len(positions)
...:
...: fig, ax= plt.subplots()
...:
...: ax.set_ylim(-0.05, 1.05) # standard Matplotlib margins
...: ax.set_yticks(np.arange(0,lp)/(lp-1))
...: ax.set_yticklabels((repr(p) for p in positions))
...:
...: x = np.linspace(0, 1, 101) ; y=20*x*(1+x)
...:
...: plt.plot(x, f(y))
...: plt.grid()
мой сюжет