def plotWarp(a, b, warpObj, ts=[]):
    """Plots the comprehensive results of a time warp, including the 
	cost matrix, backtrace path, visualisation of the warping statistics and the 
	individual time series, with warp lines.

	Parameters
	----------
		a : list
			First time series, which has been warped against time series b
		b : list 
			Second time series (reference)
		warpObj : dict
			A timeWarpOB warp object - see output of ``timeWarpOB.timeWarp()``.
			NB: the object must contain the calclauted cost matrix (i.e. ``retMat = True``)
		ts : list
			Optional list of timestamps for displaying on the graphs. If no timestamps are 
			given, each time period will be given an incremented number, staring at 1.

	Returns
	-------
		matplotlib.pyplot
			A composite plot showing the results of the time warp.

	"""
    import matplotlib.pyplot as plt
    costMat = warpObj['costMat']
    path = warpObj['backTracePath']
    w = warpObj['warpWindow']
    n = len(costMat)
    gridSize = 5, 5
    if ts == []:
        dateRot = 0
        for i in range(n):
            ts.append(i)
    else:
        dateRot = 20
    plt.subplot2grid(gridSize, (2, 1), rowspan=2, colspan=2)
    plt.imshow(costMat, interpolation='nearest', cmap='Greys', aspect='auto')
    plt.autoscale(False)
    plt.gca().invert_yaxis()
    plt.xlabel('b')
    plt.ylabel('a')
    plt.plot([0, n], [0, n], 'y')
    plt.plot([0, n - w], [w, n], 'm--')
    plt.plot([w, n], [0, n - w], 'm--')
    for i in range(len(path) - 1):
        x1 = path[i][1]
        x2 = path[i + 1][1]
        y1 = path[i][0]
        y2 = path[i + 1][0]
        plt.plot([x1, x2], [y1, y2], 'r')
    plt.subplot2grid(gridSize, (4, 1), colspan=2)
    plt.plot(ts, b, 'g^-', label='b')
    plt.xticks(rotation=dateRot)
    c = a.copy()
    plt.subplot2grid(gridSize, (2, 0), rowspan=2)
    plt.plot(c, ts, 'bo-', label='a')
    plt.gca().invert_xaxis()
    plt.subplot2grid(gridSize, (0, 1), rowspan=2, colspan=2)
    plt.plot(ts, a, 'bo-', label='a')
    plt.plot(ts, b, 'g^-', label='b')
    plt.legend()
    for [map_x, map_y] in path:
        plt.plot([ts[map_x], ts[map_y]], [a[map_x], b[map_y]], 'r')
    plt.xticks(rotation=dateRot)
    plt.subplot2grid(gridSize, (2, 3), rowspan=2, colspan=2)
    xMax = len(a)
    yMin = -w - 1
    yMax = w + 1
    avgWarp = warpObj['warpStats']['avgWarp']
    plt.plot([0, xMax], [0, 0], 'y')
    plt.plot([0, xMax], [-w, -w], 'm--')
    plt.plot([0, xMax], [w, w], 'm--')
    plt.plot([0, xMax], [avgWarp, avgWarp], 'c:')
    plt.axis([0, xMax, yMin, yMax])
    plt.gca().set_autoscale_on(False)
    for i in range(len(path) - 1):
        i1 = path[i][0]
        i2 = path[i + 1][0]
        j1 = path[i][1]
        j2 = path[i + 1][1]
        x1 = i1 / 2 + j1 / 2
        y1 = i1 - j1
        x2 = i2 / 2 + j2 / 2
        y2 = i2 - j2
        plt.plot([x1, x2], [y1, y2], 'r')
    plt.tight_layout(pad=0.4, w_pad=0.4, h_pad=0.4)
    plt.show(block=False)
