Поместите разрыв /разрыв в линейный сюжет

У меня есть набор данных с эффективно «непрерывными» показаниями датчика, со случайным промежутком.

Однако есть несколько периодов, в которые данные не были записаны. Эти разрывы значительно длиннее периода выборки.

По умолчанию pyplot соединяет каждую точку данных со следующей (если у меня установлен стиль линии), однако я чувствую, что это немного вводит в заблуждение, когда он соединяет две точки данных по обе стороны от большого промежутка.

Я бы предпочел, чтобы там просто не было строки; то есть я хотел бы, чтобы линия остановилась и возобновилась после разрыва.

Я попытался добавить элемент в этих разделах пробела с помощью значения y None, но, похоже, отправил строку обратно в более ранняя часть графика (хотя странно, что эти линии появляются не на всех уровнях масштабирования).

Другой вариант, о котором я подумал, - просто построить каждый фрагмент с отдельным вызовом plot, но это будет немного некрасиво и громоздко.

Есть ли более элегантный способ добиться этого?

Редактировать: ниже приведен минимальный рабочий пример, демонстрирующий поведение. Первый сюжет - это линия соединения, которую я пытаюсь избежать. Второй график показывает, что добавление значения None работает, однако, если вы перемещаете представление графика, вы получаете то, что показано в третья фигура - линия, переходящая к более ранней части сюжета.

import numpy as np
import matplotlib.pyplot as plt

t1 = np.arange(0, 8, 0.05)
t2 = np.arange(10, 14, 0.05)
t = np.concatenate([t1, t2])
c = np.cos(t)

fig = plt.figure()
ax = fig.gca()
ax.plot(t, c)
ax.set_title('Undesirable joining line')


t1 = np.arange(0, 8, 0.05)
t2 = np.arange(10, 14, 0.05)
c1 = np.cos(t1)
c2 = np.cos(t2)
t = np.concatenate([t1, t1[-1:], t2])
c = np.concatenate([c1, [None,], c2])

fig = plt.figure()
ax = fig.gca()
ax.plot(t, c)
ax.set_title('Ok if you don\'t pan the plot')

fig = plt.figure()
ax = fig.gca()
ax.plot(t, c)
ax.axis([-1, 12, -0.5, 1.25])
ax.set_title('Strange jumping line')

plt.show()

Сюжет 3, "странная прыгающая линия"

10 голосов | спросил Alex 27 MaramWed, 27 Mar 2013 09:32:05 +04002013-03-27T09:32:05+04:0009 2013, 09:32:05

1 ответ


0

Маскированные массивы хорошо подходят для этого. Вам просто нужно замаскировать первый из точек, которые вы не хотите соединять:

import numpy as np
import numpy.ma as ma
import matplotlib.pyplot as plt

t1 = np.arange(0, 8, 0.05)
mask_start = len(t1)
t2 = np.arange(10, 14, 0.05)
t = np.concatenate([t1, t2])
c = np.cos(t)     # an aside, but it's better to use numpy ufuncs than list comps

mc = ma.array(c)
mc[mask_start] = ma.masked
plt.figure()
plt.plot(t, mc)
plt.title('Using masked arrays')

plt.show()

введите описание изображения здесь

По крайней мере, в моей системе (OSX, Python 2.7, mpl 1.1.0) у меня нет проблем с панорамированием и т. д.

ответил tom10 27 MarpmWed, 27 Mar 2013 19:53:00 +04002013-03-27T19:53:00+04:0007 2013, 19:53:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132