2016-01-06 2 views
1

У меня проблемы с построением двух массивов с правильным масштабированием. Я использую пакет dtw для сравнения двух массивов: x и y (https://pypi.python.org/pypi/dtw/1.0). Функция dtw возвращает матрицу и путь. С помощью следующего кода, можно построить матрицу и путь:Кривые построения, выровненные по матрице динамического временного деформирования

import matplotlib.pyplot as plt 

dist, cost, acc, path = dtw(x, y, dist=lambda x, y: norm(x - y, ord=1)) 

plt.imshow(acc.T, origin='lower', cmap=cm.gray, interpolation='nearest') 
plt.colorbar() 
plt.plot(path[0], path[1], 'w') 

plt.ylim((-0.5, acc.shape[1]-0.5)) 
plt.xlim((-0.5, acc.shape[0]-0.5)) 

Итоговое фигуру: enter image description here Тем не менее, я хотел бы построить две кривые, выровненные к нему, как показано на (http://www.psb.ugent.be/cbd/papers/gentxwarper/DTWalgorithm.htm). Одна кривая выше матрицы, другая - с левой стороны, так что вы можете сравнить, какие части равны.

+0

Определенно выполнимо. [Этот пример] (http://matplotlib.org/examples/pylab_examples/scatter_hist.html) имеет разные типы данных, но аналогичный макет. Может быть, вы можете приспособить его? – kwinkunks

ответ

3

Как предложено kwinkunks (см. Комментарий) Я использовал this example в качестве шаблона. Обратите внимание, что я использовал «plt.pcolor()» вместо «plt.image()» для построения матрицы. Это мой код, и полученный показатель:

''' 
Plotting 
''' 

nullfmt = NullFormatter() 

# definitions for the axes 
left, width = 0.12, 0.60 
bottom, height = 0.08, 0.60 
bottom_h = 0.16 + width 
left_h = left + 0.27 
rect_plot = [left_h, bottom, width, height] 
rect_x = [left_h, bottom_h, width, 0.2] 
rect_y = [left, bottom, 0.2, height] 

# start with a rectangular Figure 
plt.figure(2, figsize=(8, 8)) 

axplot = plt.axes(rect_plot) 
axx = plt.axes(rect_x) 
axy = plt.axes(rect_y) 

# Plot the matrix 
axplot.pcolor(acc.T,cmap=cm.gray) 
axplot.plot(path[0], path[1], 'w') 

axplot.set_xlim((0, len(x))) 
axplot.set_ylim((0, len(linear))) 
axplot.tick_params(axis='both', which='major', labelsize=18) 

# Plot time serie horizontal 
axx.plot(x,'.', color='k') 
axx.tick_params(axis='both', which='major', labelsize=18) 
xloc = plt.MaxNLocator(4) 
x2Formatter = FormatStrFormatter('%d') 
axx.yaxis.set_major_locator(xloc) 
axx.yaxis.set_major_formatter(x2Formatter) 

# Plot time serie vertical 
axy.plot(y,linear,'.',color='k') 
axy.invert_xaxis() 
yloc = plt.MaxNLocator(4) 
xFormatter = FormatStrFormatter('%d') 
axy.xaxis.set_major_locator(yloc) 
axy.xaxis.set_major_formatter(xFormatter) 
axy.tick_params(axis='both', which='major', labelsize=18) 

#Limits 
axx.set_xlim(axplot.get_xlim()) 
axy.set_ylim(axplot.get_ylim()) 

plt.show() 

enter image description here

Смежные вопросы