1

作为标题,我正在研究时间序列对齐,并且需要对齐结果的可视化。

为此,我想绘制连接对齐算法生成的“锚点”的线。

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

示例中的锚点指定两个时间序列的索引ap之间的一对一“映射” ,即对应于;到; 和到。目标是在两个单独的图之间画线以显示对齐的结果。xyx[0]y[0]x[4]y[9]x[9]y[19]

4

2 回答 2

1

要连接 matplotlib 中的两个子图,您可以使用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()

在此处输入图像描述

于 2017-05-18T10:48:11.813 回答
0

感谢@ImportanceOfBeingErnest,我确定了 OP 中的错字并实现了两个不同长度系列之间的连接索引:

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)

在此处输入图像描述

我知道这不是主题,但是如何进一步截断空白部分以使 x 轴的范围适合信号长度,同时保持两个信号长度的实际比率?虽然sharex=ax1显示了信号长度的比例,但上图右侧的空白部分很烦人。

于 2017-05-19T03:42:35.147 回答