Изменить стиль библиотек matplotlib линии середины графике

Я рисую некоторые данные (две строки), и я хотел бы изменить стиль линии для тех частей строк, где разница между ними статистически значима. Итак, в приведенном ниже изображении (теперь ссылки B/C anti-spam policies не позволяют мне публиковать изображение) я хотел бы, чтобы строки выглядели по-другому (например, пунктирно), пока они не начнут сходиться примерно на 35 по оси x.

сюжет

есть ли способ сделать это легко? У меня есть значения для оси x, где различия значительны, я просто не понимаю, как изменить стили линий в определенных местах оси X.

2 ответов


Edit: у меня было это открыто и осталось, поэтому я не заметил ответа @Ricardo. Поскольку matplotlib будет конвертировать вещи в массивы numpy независимо, есть более эффективные способы сделать это.

пример:

просто нарисуйте две разные линии,одну с пунктирным стилем, а другую с сплошным стилем.

Э. Г.

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y1 = 2 * x
y2 = 3 * x

xthresh = 4.5
diff = np.abs(y1 - y2)
below = diff < xthresh
above = diff >= xthresh

# Plot lines below threshold as dotted...
plt.plot(x[below], y1[below], 'b--')
plt.plot(x[below], y2[below], 'g--')

# Plot lines above threshold as solid...
plt.plot(x[above], y1[above], 'b-')
plt.plot(x[above], y2[above], 'g-')

plt.show()

enter image description here

для случая, когда они циклические, используйте маскировку массивы:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 100)
y1 = 2 * np.cos(x)
y2 = 3 * np.sin(x)

xthresh = 2.0
diff = np.abs(y1 - y2)
below = diff < xthresh
above = diff >= xthresh

# Plot lines below threshold as dotted...
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y1), 'b--')
plt.plot(np.ma.masked_where(below, x), np.ma.masked_where(below, y2), 'g--')

# Plot lines above threshold as solid...
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y1), 'b-')
plt.plot(np.ma.masked_where(above, x), np.ma.masked_where(above, y2), 'g-')

plt.show()

enter image description here


предположим, что ваши данные находятся на массивах NumPy dataset1 и dataset2 и определения threshold как ваше значение

def group(data):
    """Assumes that len(data) > 0"""
    prev = 0
    index = 1
    value = data[0]

    while (index < len(data)):
        if data[index] != value:
            yield (value, prev, index)

            value = not value
            prev = index
        index += 1

    yield (value, prev, index)

diff = np.abs(dataset1 - dataset2)
for significant, start, end in group(diff < threshold):
   # Plot data from dataset1[start:end] and dataset2[start:end]
   # Use the value in "significant" (True/False) to figure out
   # The style