2017-05-18 1 views
1

Als Titel arbeite ich an der Zeitreihenausrichtung, und eine Visualisierung des Ausrichtungsergebnisses ist erwünscht.Zeichnen Sie Linien, die Punkte zwischen zwei separaten One-D-Plots verbinden

Zu diesem Zweck möchte ich Linien zeichnen verbinden "Ankerpunkte" durch den Alignment-Algorithmus generiert.

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') 

die Ankerpunkte ap im Beispiel gibt die one-to-one "mapping" zwischen dem Indizes von zwei Zeitreihen x und y, d.h. x[0] wird entsprechend y[0]; x[4] bis y[9]; und x[9] bis y[19]. Das Ziel besteht darin, Linien zwischen zwei separaten Plots zu zeichnen, um das Ergebnis der Ausrichtung anzuzeigen.

+0

Was ist der Zweck der zweiten Reihe von 'ap'? – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest Es gibt Tippfehler in der Mapping-Beschreibung. Ich habe es behoben. – Francis

Antwort

1

Um zwei Subplots in Matplotlib zu verbinden, können Sie eine ConnectionPatch verwenden.

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

Danke für die Antwort! Ich habe den Tippfehler im OP korrigiert, Entschuldigung für die Verwirrung. – Francis

0

Dank @ImportanceOfBeingErnest, identifiziert ich den Fehler im OP und erreicht Indizes zwischen zwei Reihen von unterschiedlicher Länge verbindet:

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

ich es wissen ist nicht im Thema, sondern wie man den leeren Teil weiter abschneidet, damit der Bereich der x-Achse dem Vorzeichen entspricht al Länge, während das tatsächliche Verhältnis der Länge der beiden Signale beibehalten? Obwohl sharex=ax1 das Verhältnis der Signallänge zeigt, ist der leere Teil auf der rechten Seite der oberen Abbildung störend.

Verwandte Themen