Scripting landmark warps¶
Landmark warping can be scripted using the mwarp1d.warp_landmark function.
Let’s first run an example script then consider the details:
In [1]:
%matplotlib inline
In [2]:
import numpy as np
from matplotlib import pyplot as plt
import mwarp1d
#define a plotting function (for re-use below)
def plot_warp_results(y, yw, x0, x1):
plt.figure()
ax = plt.axes()
c0,c1 = 'blue', 'orange'
ax.plot(y, color=c0, label='Original')
ax.plot(yw, color=c1, label='Warped')
[ax.plot(xx, y[xx], 'o', color=c0) for xx in x0]
[ax.plot(xx, yw[xx], 'o', color=c1) for xx in x1]
ax.legend()
ax.set_xlabel('Domain position (%)', size=13)
ax.set_ylabel('Dependent variable value', size=13)
plt.show()
#define landmarks:
Q = 101 #domain size
x0 = [38, 63] #initial landmark location(s)
x1 = [25, 68] #final landmark location(s)
#apply warp:
y = np.sin( np.linspace(0, 4*np.pi, Q) ) #an arbitary 1D observation
yw = mwarp1d.warp_landmark(y, x0, x1) #warped 1D observation
#plot:
plot_warp_results(y, yw, x0, x1)
The input arguments to warp_landmark include:
y — the 1D data to be warped
x0 — initial landmark positions
x1 — final landmark positions
Let’s consider what happens when only a single landmark is specified:
In [3]:
x0 = [38]
x1 = [25]
yw = mwarp1d.warp_landmark(y, x0, x1)
plot_warp_results(y, yw, x0, x1)
Note that using a single landmark causes the entire domain to be warped.
To restrict warping effects to a local area, add more landmarks, like this:
In [4]:
x0 = [12, 38, 63]
x1 = [12, 25, 63]
yw = mwarp1d.warp_landmark(y, x0, x1)
plot_warp_results(y, yw, x0, x1)