2017-05-18 4 views
1

En tant que titre, je travaille sur l'alignement des séries temporelles, et une visualisation du résultat de l'alignement est souhaitée. Pour cela, je souhaite tracer des lignes reliant des "points d'ancrage" générés par l'algorithme d'alignement.Tracer des lignes reliant des points entre deux tracés unidimensionnels distincts

np.random.seed(5) 
x = np.random.rand(10)  # time-series 1 
y = np.random.rand(20)  # time-series 2 
ap = np.array(([0, 4, 9], # the anchor points 
       [0, 9, 19])) 

fig = plt.figure(figsize=(10,5)) 
ax1 = fig.add_subplot(211) 
ax2 = fig.add_subplot(212) 
ax1.plot(x, 'r') 
ax2.plot(y, 'g') 

les points d'ancrage ap dans l'exemple spécifier l'un-à-un "mapping" entre les indices de deux séries temporelles x et y, à savoir, est x[0] correspondant à y[0]; x[4] à y[9]; et x[9] à y[19]. L'objectif est de tracer des lignes entre deux parcelles séparées pour montrer le résultat de l'alignement.

+0

Quel est le but de la deuxième rangée de 'ap'? – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest désolé, il y a des fautes de frappe dans la description de la cartographie. Je l'ai réparé. – Francis

Répondre

1

Pour connecter deux sous-trames dans matplotlib, vous pouvez utiliser un ConnectionPatch.

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import ConnectionPatch 

np.random.seed(5) 
x = np.random.rand(21)  # time-series 1 
y = np.random.rand(21)  # time-series 2 
ap = np.array(([0, 5, 10], # the anchor points 
       [0,10, 20])) 

fig = plt.figure(figsize=(10,5)) 
ax1 = fig.add_subplot(211) 
ax2 = fig.add_subplot(212) 
ax1.plot(x, 'r') 
ax2.plot(y, 'g') 

ls = ["-","--"] 
c = ["gold", "blue"] 

for i, row in enumerate(ap): 
    for j, ind in enumerate(row): 
     px = (ind, x[ind]) 
     py = (ind, y[ind]) 
     con = ConnectionPatch(py,px, coordsA="data", coordsB="data", 
         axesA=ax2, axesB=ax1, linestyle=ls[i], color=c[i]) 
     ax2.add_artist(con) 

plt.show() 

enter image description here

+0

Merci pour la réponse! J'ai corrigé la faute de frappe dans l'OP, désolé pour la confusion. – Francis

0

Merci à @ImportanceOfBeingErnest, j'ai identifié la faute de frappe dans l'OP et les indices obtenus reliant entre deux séries de longueurs différentes:

np.random.seed(5) 
x = np.random.rand(10) 
y = np.random.rand(20) 
ap = np.array(([0, 4, 9], 
       [0,9, 19])) 

fig = plt.figure(figsize=(10,5)) 
ax1 = fig.add_subplot(211) 
ax2 = fig.add_subplot(212, sharex=ax1) 
ax1.plot(x, 'r') 
ax2.plot(y, 'g') 

plt.setp(ax1.get_xticklabels(), visible=False) 

for j in ap.T: 

    ax1.axvline(x=j[0], linestyle='--', color='k') 
    ax2.axvline(x=j[1], linestyle='--', color='k') 

    x_ind = (j[0], ax1.get_ylim()[0]) 
    y_ind = (j[1], ax2.get_ylim()[1]) 

    con = ConnectionPatch(y_ind, x_ind, coordsA="data", coordsB="data", 
          axesA=ax2, axesB=ax1, linewidth='1.5') 

    ax2.add_artist(con) 

enter image description here

Je sais que ce est hors du sujet, mais comment tronquer davantage la partie vide afin de faire correspondre la gamme de l'axe des x avec le signe toute la longueur, tout en maintenant le rapport réel de la longueur des deux signaux? Bien que sharex=ax1 montre le rapport de la longueur du signal, la partie vide à droite de la figure du haut est gênante.